jsの正規表現の原理

一个新手
リリース: 2017-09-07 09:41:20
オリジナル
1739 人が閲覧しました

正規表現をより効率的に使用するには、まず正規表現の仕組みを理解する必要があります。正規表現処理の基本手順を次に示します。

基本手順

ステップ 1: コンパイル

正規表現オブジェクトを作成するとき (通常のリテラルまたは RegExp コンストラクター)、ブラウザーは式を検証し、それをマッチング作業を実行するネイティブ コード プログラムに変換します。通常のオブジェクトを変数に割り当てると、重複を避けることができます。このステップを実行します。

ステップ2:開始位置を設定する

正規クラスが使用状態になると、まず対象文字列の検索開始位置を決定します。文字列の開始文字、または正規表現でlastIndex属性を指定します。ただし、4 番目のステップから (一致の試行が失敗したため) 戻ったとき、この位置は、最後の一致の開始位置から次の文字の位置になります。

ブラウザ メーカーの最適化を回避するのが、正規表現エンジンのアプローチです。たとえば、正規表現が ^ で始まる場合、一致が失敗した場合に、IE と Chrome は位置を一致させることができますか?後続の位置を愚かに検索することは避けてください。もう 1 つの例は、3 番目の文字が x である文字列を照合することです。賢い方法は、最初に x を見つけてから、開始位置に戻ることです

ステップ 3: 各正規表現文字を照合します。

正規表現は開始位置を認識すると、テキストと正規表現パターンを 1 つずつチェックし、特定の文字が一致しない場合、正規表現は以前に一致を試みた位置までバックトラックして再試行します。他の可能なパス

ステップ 4: 一致の成功または失敗

文字列の現在の位置で完全一致が見つかった場合、正規表現は一致を宣言します。正規表現のすべての可能なパスが一致しない場合、正規表現エンジンは 2 番目のステップに戻り、文字列の各文字 (および最後の文字列の後の位置) がすべてこのプロセスを経たときに、一致するものが見つからなかった場合、次の文字から再試行します。完全一致の失敗を宣言します

バックトラック

正規表現がターゲット文字列と一致すると、式のコンポーネントが左から右に 1 つずつテストされ、量指定子と分岐が見つかった場合は、一致するものが見つかるかどうかが確認されます。次に何をするかを決定する必要があります。量指定子 (

演算子など) が見つかった場合は、正規表現を使用するたびに、必要に応じて、オプションから 1 つを選択する必要があります。現在のオプションが正常に一致した場合、正規表現は式のスキャンを続行し、他の部分も正常に一致した場合、一致する値が存在しない場合は一致が終了します。オプションで が見つかるか、後続の部分一致が失敗した場合、正規表現は最後の決定点までバックトラックし、残りのオプションの 1 つを選択します。このプロセスは、一致が見つかるか、正規表現 If すべての順列が見つかるまで続行されます。式内の量指定子と分岐オプションの組み合わせが失敗すると、マッチングは放棄され、文字列内の次の文字に移動して、プロセスが繰り返されます*,+?{2, }),  正则表达式需决定何时尝试匹配更多字符; 如果遇到分支(来自|

次の例は、「ハイパフォーマンス」セクションからのものです。 「JavaScript のリピートとバックトラッキング」は、バックトラッキングをよく理解するのに役立ちます

var str = "<p>Para 1.</p>" + 
          "<img  src=&#39;1.jpg&#39; alt="jsの正規表現の原理" >" + 
          "<p>para 2.</p>" +
          "<p>p.</p>";

/<p>.*<\/p>/i.test(str);//method 1
/<p>.*?<\/p>/i.test(str);//method 2
ログイン後にコピー

下の図を参照してください


jsの正規表現の原理

以上がjsの正規表現の原理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート