正規表現ログイン

正規表現

正規表現とは一体何ですか?

文字は、コンピューター ソフトウェアがテキストを処理する際の最も基本的な単位であり、文字、数字、句読点、スペース、改行、漢字などが含まれます。文字列とは、0 個以上の文字のシーケンスです。テキストはテキスト、文字列です。特定の文字列が特定の正規表現に一致すると言うことは、通常、文字列の一部 (またはいくつかの部分) がその式で指定された条件を満たすことができることを意味します。

文字列を処理するプログラムや Web ページを作成する場合、特定の複雑なルールに一致する文字列を検索する必要があることがよくあります。正規表現は、これらのルールを記述するために使用されるツールです。言い換えれば、正規表現はテキスト ルールを記録するコードです。

Windows/Dos でのファイル検索に使用されるワイルドカード文字 (ワイルドカード)、つまり * と ? を使用した可能性が非常に高いです。特定のディレクトリ内のすべての Word ドキュメントを検索したい場合は、*.doc を検索します。ここで、* は任意の文字列として解釈されます。ワイルドカードと同様に、正規表現もテキストの一致に使用されるツールですが、ワイルドカードよりもニーズを正確に記述することができます。もちろん、複雑になりますが、たとえば、「すべてを検索するために使用される」という正規表現を書くことができます。 0 で始まり、2 ~ 3 桁、ハイフン「-」、最後に 7 桁または 8 桁の文字列 (010-12345678 や 0376-7654321 など)。

入門

正規表現を学習する最良の方法は、例を理解した後、例を自分で変更して実験することです。以下にいくつかの簡単な例を示し、詳細に説明します。

英語の小説で hi を検索すると仮定すると、正規表現 hi を使用できます。

これは、ほぼ最も単純な正規表現で、次のような文字列に正確に一致します。最初の文字は h で、最後の文字は i です。通常、正規表現を処理するツールには、大文字と小文字を区別しないオプションが用意されています。このオプションを選択すると、hi、HI、Hi、および hI の 4 つの大文字と小文字のいずれにも一致します。

残念なことに、hi 、history、high など、多くの単語に 2 つの連続した文字 hi が含まれています。 hi を使用して検索すると、hi here も検索されます。 hi という単語を正確に見つけたい場合は、bhib を使用する必要があります。

b は、正規表現 (まあ、メタキャラクターと呼ぶ人もいます) で指定された特別なコードで、単語の境界である単語の先頭または末尾を表します。通常、英語の単語はスペース、句読点、または改行で区切られますが、 b はこれらの単語区切り文字のいずれとも一致せず、1 つの位置のみと一致します。

より正確に言う必要がある場合、 b は前後の文字が両方ではない位置 (一方は存在する、もう一方は存在しない、または存在しない) w と一致します。

こんにちはに続いて遠くないルーシーを探している場合は、bhib.*bLucyb を使用する必要があります。

ここで、 . は別のメタ文字であり、改行文字を除く任意の文字に一致します。 * もメタキャラクターですが、文字や位置を表すのではなく、量を表します。これは、式全体を一致させるために、* より前の内容を何度でも繰り返し使用できることを指定します。したがって、.* は、改行を含まない任意の数の文字を合わせて意味します。これで、bhib.*bLucyb の意味は明らかです。最初に単語 hi、次に任意の数の文字 (改行は除く)、そして最後に単語 Lucy です。

改行文字は「n」で、ASCII エンコーディングが 10 (16 進数の 0x0A) である文字です。

他のメタキャラクターを同時に使用すると、より強力な正規表現を構築できます。たとえば、次の例:

0dd-dddddddd は、0 で始まり、次に 2 桁、ハイフン「-」、最後に 8 桁の文字列 (つまり、中国の電話番号) と一致します。もちろん、この例では、市外局番が 3 桁の場合に一致します)。

ここでの d は、1 つの数字 (0、または 1、または 2、または...) に一致する新しいメタキャラクターです。 - はメタ文字ではなく、それ自体、つまりハイフン (またはマイナス記号、ハイフン、または任意の名前) とのみ一致します。

煩わしい繰り返しを避けるために、この式を 0d{2}-d{8} のように書くこともできます。 ここで、d の後の {2} ({8}) は、前の d が連続して 2 回 (8 回) 繰り返されて一致する必要があることを意味します。それともあなたは天才ですか、それとも地球人ではありませんか。正規表現の構文は、定期的に使用している人であっても混乱を招く可能性があります。正規表現は読み書きが難しく、エラーが発生しやすいため、正規表現をテストするツールを見つける必要があります。

正規表現の詳細は、環境によって異なります。このチュートリアルでは、Microsoft .Net Framework 2.0 での正規表現の動作を紹介します。そのため、.Net での Regex Tester と呼ばれるツールを紹介します。まず .Net Framework 2.0 がインストールされていることを確認してから、Regex Tester をダウンロードします。これはグリーン ソフトウェアです。ダウンロード後、圧縮パッケージを開いて RegexTester.exe を直接実行します。 以下は、実行中の Regex Tester のスクリーンショットです:

Metacharacters

これで、b、.、*、d などのいくつかの便利なメタ文字がわかりました。正規表現には、スペースやタブ文字 (タブ)、改行などの空白文字に一致する s などのメタ文字がさらにあります。文字、中国語全角スペースなどw は、文字、数字、アンダースコア、漢字などに一致します。

中国語/漢字の特殊処理は、.Net が提供する正規表現エンジンによってサポートされています。その他の環境での詳細については、関連ドキュメントを確認してください。

さらにいくつかの例を示します:

baw*b は、文字 a で始まる単語に一致します。最初に単語の先頭 (b)、次に文字 a、次に任意の数の文字または数字 (w *)、最後に単語の終わり (b)。

さて、正規表現内の単語の意味について話しましょう。少なくとも 1 つの連続した w です。はい、これは英語を学ぶときに覚えなければならない同じ名前の何千ものこととはほとんど関係がありません:)

d+ は 1 つ以上の連続する数字に一致します。 ここでの + は * に似たメタキャラクターですが、* は任意の回数 (0 回も) 繰り返されたものと一致するのに対し、+ は 1 回以上繰り返されたものと一致する点が異なります。

bw{6}b は、ちょうど 6 文字の単語に一致します。

表 1. 一般的に使用されるメタキャラクター

QQ截图20161010113058.png

正規表現エンジンは通常、JavaScript の RegExp.test() メソッドや Regex.IsMatch(. ) NET のメソッド。ここでの一致とは、文字列の中に表現規則に適合する部分があるかどうかを指します。 ^ と $ が使用されていない場合、d{5,12} に対してこのメ​​ソッドを使用すると、文字列全体が 5 ~ 12 桁になるのではなく、文字列に連続する 5 ~ 12 桁が含まれることのみが保証されます。

メタキャラクター ^ (数字の 6 と同じキー位置にある記号) と $ はどちらも同じ位置に一致し、b に似ています。 ^ は探している文字列の先頭に一致し、$ は末尾に一致します。これら 2 つのコードは、入力内容を確認するときに非常に役立ちます。たとえば、Web サイトで入力する QQ 番号を 5 ~ 12 桁にする必要がある場合は、^d{5,12}$ を使用できます。ここの

{5,12} は、前に紹介した {2} と似ていますが、{2} は 2 回以上もそれ以下も繰り返すことができず、{5,12} は 5 回以上繰り返すことができる点が異なります。 12 回以内、それ以外の場合は一致しません。

^ と $ が使用されているため、d{5,12} と一致するには入力文字列全体を使用する必要があります。つまり、入力全体が 5 ~ 12 個の数値である必要があるため、入力された QQ 番号が一致する場合は、この正規表現が使用されている場合、要件を満たしています。

大文字と小文字を無視するオプションと同様に、一部の正規表現処理ツールには複数行を処理するオプションもあります。このオプションを選択すると、^ と $ の意味が一致する行の開始と終了になります。

キャラクターエスケープ

メタキャラクター自体を検索したい場合、たとえば . や * を検索する場合、問題があります。メタキャラクターは別のものとして解釈されるため、指定することができません。このとき、これらの文字の特別な意味をキャンセルするために を使用する必要があります。したがって、 と * を使用する必要があります。もちろん、それ自体を検索するには、\.

も使用する必要があります。たとえば、deerchao.net は deerchao.net に一致し、C:\Windows は C:Windows に一致します。

Repeat

繰り返しを一致させるための以前の *、+、{2}、{5,12} の方法はすでに見てきました。以下は、正規表現内のすべての修飾子です (*、{5,12} など、指定された数のコード):

表 2. よく使用される修飾子

QQ截图20161010113118.png

ここでは、繰り返しの使用例をいくつか示します:

Windowsd+ Windows の後に 1 つ以上の数字が続くものと一致します

^w+ 行の最初の単語 (または文字列全体の最初の単語、一致の具体的な意味はオプション設定によって異なります) と一致します

文字クラス

数字、文字、数字を検索するには、これらの文字セットに対応するメタキャラクターがすでに存在するため、空白を使用するのは非常に簡単ですが、事前定義されたメタキャラクターのない文字セット (母音 a、e、i、 o、u)、どうすればいいですか?

非常に簡単です。[aeiou] は英語の母音に一致し、[.?!] は句読点 (. または? または!) に一致するように、角かっこで囲むだけです。

文字範囲を簡単に指定することもできます。たとえば、[0-9] は d とまったく同じ意味を表します。同様に、[a-z0-9A-Z_] も w と完全に同等です。英単語も考慮されます)。

次はより複雑な式です: (?0d{2}[) -]?d{8}。

「(」と「)」もメタキャラクターですが、後でグループ化セクションで説明するため、ここでエスケープする必要があります。

この式は、(010)88886666、022-22334455、02912345678 など、いくつかの形式の電話番号と一致します。これについて分析してみましょう。最初にエスケープ文字があります (0 回または 1 回出現する可能性があります (?)、次に 0、その後に 2 桁の数字 (d{2}) が続きます)、または - またはスペースの 1 つです。 、1回現れるか現れないか(?)、最後に8桁(d{8})。

分岐条件

残念ながら、今の式は 010)12345678 や (022-87654321) などの「間違った」形式にも一致する可能性があります。分岐条件を使用する必要があります。正規表現では、複数のルールを参照します。そのいずれかが一致した場合、異なるルールを | で区切る必要があります。例:

0d{2}-d {8}|0d{3}-d{7} この式は、ハイフンで区切られた 2 つの電話番号と一致します。1 つは 3 桁の市外局番と 8 桁の市外局番 (010-12345678 など)、もう 1 つは電話番号です。 4 桁の市外局番と 7 桁の市内番号 (0376-2233445)。

(0d{2})[- ]?d{8}|0d{2}[- ]?d{8} この式は、3 桁の市外局番を持つ電話番号と一致します。市外局番は括弧で囲むことができます。 、またはいいえ、市外局番と市内局番はハイフンまたはスペースで区切ることも、区切らなくてもかまいません。分岐条件を使用してこの式を拡張し、4 桁の市外局番もサポートできるようにすることができます。

d{5}-d{4}|d{5} この式は、米国の郵便番号と一致するために使用されます。米国の郵便番号の規則は 5 桁、またはハイフンで区切られた 9 桁です。この例を示した理由は、分岐条件を使用するときは各条件の順序に注意する必要があるという問題を説明できるためです。 これを d{5}|d{5}-d{4} に変更すると、5 桁の郵便番号 (および 9 桁の郵便番号の最初の 5 桁) のみが照合されます。その理由は、分岐条件を照合するときに、各条件が左から右にテストされ、特定の分岐が満たされると、他の条件は考慮されないためです。

グループ

単一の文字を繰り返す方法についてはすでに説明しましたが (文字の直後に修飾子を追加するだけです)、複数の文字を繰り返したい場合はどうすればよいでしょうか。かっこを使用して部分式 (グループ化とも呼ばれます) を指定し、この部分式の繰り返し数を指定できます。また、部分式に対して他の操作を実行することもできます (後で説明します)。

(d{1,3}.){3}d{1,3} は、単純な IP アドレス一致式です。この式を理解するには、次の順序で分析してください。 d{1,3} は 1 ~ 3 桁の数値 (d{1,3}.){3} は 3 桁の数値とピリオドを一致させます (これは全体はこのグループです)を3回繰り返し、最後に1~3桁の数字(d{1,3})を加えます。

IP アドレスの各数字は 255 を超えることはできません。「24」の第 3 シーズンの脚本家に騙されないでください...

残念ながら、これはあり得ない IP アドレス 256.300.888.999 にも一致します。算術比較を使用できる場合は、この問題を簡単に解決できる可能性がありますが、正規表現では数学関数が提供されないため、正しい IP アドレスを記述するには、長いグループ化、選択、および文字クラスのみを使用できます:( (2 [0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)。

この式を理解するための鍵は、2[0-4]d|25[0-5]|[01]?dd? を理解することです。ここではその意味を分析できるはずです。あなた自身。

Antononyms

場合によっては、単純に定義された文字クラスに属さない文字を検索する必要があります。たとえば、数字以外の文字を検索したい場合は、次の反意語を使用する必要があります。

括弧を使用して部分式を指定した後、この部分式に一致するテキスト (つまり、このグループによってキャプチャされたコンテンツ) を式または他のプログラムでさらに処理できます。デフォルトでは、各グループには自動的にグループ番号が付けられます。ルールは、グループの左括弧をマークとして左から右に、最初に表示されるグループのグループ番号は 1、2 番目のグループのグループ番号は 2、そしてなどのアナロジー。

ええと...実際、グループ番号の割り当ては、先ほど述べたほど単純ではありません:

グループ 0 は正規表現全体に対応します

実際、グループ番号の割り当てプロセスでは、左から右に 2 回スキャンする必要があります。最初のパスは名前のないグループのみに割り当て、2 番目のパスは名前付きグループのみを割り当てます。そのため、すべての名前付きグループのグループ番号は名前のないグループ番号より大きくなります

(?:exp) のような構文を使用して、グループ ペアを解除できますグループ番号割り当ての参加権。

後方参照は、前のグループに一致するテキストを繰り返し検索するために使用されます。たとえば、1 はグループ 1 に一致するテキストを表します。わかりにくいですか?例を参照してください:

b(w+)bs+1b は、go go や kitty kitty などの繰り返しの単語と一致させるために使用できます。この式は最初に単語、つまり単語の先頭と末尾の間にある複数の文字または数字 (b(w+)b) であり、次に 1 つの 1 つまたは複数の空白が番号付けされたグループに取り込まれます。文字 (s+)、最後にグループ 1 でキャプチャされたコンテンツ (つまり、以前に一致した単語) (1)。

部分式のグループ名を自分で指定することもできます。部分式のグループ名を指定するには、次の構文を使用します: (?<Word>w+) (または山かっこを ': (?'Word'w+) に置き換えます)。これにより、w+ のグループ名は次のようになります。 Wordとして指定されます。このグループによってキャプチャされたコンテンツを後方参照するには、k<Word> を使用できるため、前の例は次のように記述することもできます: b(?<Word>w+)bs+k<Word>b。

かっこを使用する場合、特殊な目的の構文が多数あります。最も一般的に使用されるもののいくつかを以下に示します。

表 4. 一般的なグループ化構文

QQ截图20161010113211.png

ゼロ幅アサーション

地球人の皆さん、これらの用語の名前は複雑すぎて理解するのが難しいと思いますか?覚えて?私もそれを感じています。そのようなものがあることを知ってください、それは何と呼ばれますか、それを手放してください!名前がなければ剣術の練習に集中でき、物体に名前がなければ自由に選択できます...

次の 4 つは、特定の内容の前後を検索するために使用されます (ただし、これらの内容は含まれません) )、つまり b,^,$ のように、特定の条件を満たすべき位置 (つまりアサーション) を指定するために使用されると言われており、ゼロ幅アサーションとも呼ばれます。例を使用して説明するのが最善です。

アサーションは、true であるべき事実を宣言するために使用されます。正規表現のマッチングは、アサーションが true の場合にのみ続行されます。

(?=exp) は、ゼロ幅の正の先読みアサーションとも呼ばれ、式 exp が出現する位置以降で一致できることを主張します。たとえば、bw+(?=ingb) は、ing で終わる単語の前の部分 (ing 以外) と一致します。たとえば、「I'm sing while you're dance.」を検索すると、sing と dance が一致します。

(?<=exp) は、ゼロ幅ポジティブポストルックバックアサーションとも呼ばれ、それ自体の前の位置が式 exp と一致できることを主張します。たとえば、(?<=bre)w+b は、re で始まる単語の後半 (re 以外) に一致します。たとえば、本を読むを検索する場合、ading に一致します。

非常に長い数値の 3 桁ごとにカンマを追加したい場合 (もちろん右から追加します)、次のように先頭と内側にカンマを追加する必要がある部分を見つけることができます: ((?< ;= d)d{3})+b を使用して 1234567890 を検索すると、結果は 234567890 になります。

次の例では両方のアサーションを使用しています: (?<=s)d+(?=s) は空白文字で区切られた数値と一致します (これらの空白文字は含まれません)。

負のゼロ幅アサーション

前に、特定の文字ではない文字、または特定の文字クラス (反意語) に属さない文字を検索する方法について説明しました。しかし、特定の文字が表示されないことを確認したいだけで、その文字と一致させたくない場合はどうすればよいでしょうか?たとえば、文字 q が含まれるが、q の後に文字 u が続かない単語を検索したい場合は、これを試すことができます:

bw*q[^u]w*b は、そうでない単語と一致します。 u という文字の後に q という文字が続く単語。しかし、さらにテストを行うと (または、思考が十分に鋭い場合は、それを直接観察できます)、イラク、ベンクのように、単語の末尾に q が現れる場合、この表現は間違っていることがわかります。これは、[^u] は常に 1 つの文字と一致するため、q が単語の最後の文字である場合、次の [^u] は q の後の単語区切り文字 (スペース、ピリオド、その他の文字) と一致するためです。次の w*b は次の単語と一致するため、bw*q[^u]w*b はイラクの戦闘全体と一致します。負のゼロ幅アサーションは 1 つの位置のみに一致し、文字を消費しないため、この問題を解決できます。さて、この問題は次のように解決できます: bw*q(?!u)w*b。

ゼロ幅の負の先読みアサーション (?!exp) は、この位置以降では式 exp と一致できないことをアサートします。たとえば、d{3}(?!d) は 3 桁の数字に一致しますが、これらの 3 桁の後に数字を続けることはできません。b((?!abc)w)+b は連続文字列 abc を含まない単語に一致します。

同様に、ゼロ幅の負のルックバック アサーションである (?<!exp) を使用して、この位置の前が式 exp と一致できないことを主張できます: (?<![a-z])d{7} は一致します前面 小文字ではない 7 桁の数字。

式 (?<=<(w+)>).*(?=</1>) を詳しく分析してください。この式は、ゼロ幅アサーションの真の目的を最もよく表しています。

より複雑な例: (?<=<(w+)>).*(?=</1>) は、属性を含まない単純な HTML タグ内のコンテンツと一致します。 (<?(w+)>) は接頭辞を指定します。山かっこで囲まれた単語 (たとえば、<b>)、次に .* (任意の文字列)、最後に接尾辞 (? =< ;/1>)。前述の文字エスケープを使用するサフィックスの / に注意してください。1 は後方参照であり、キャプチャされた最初のグループを参照します。そのため、プレフィックスが実際には If <b>、サフィックスは</b>です。式全体は、<b> と </b> の間の内容と一致します (ここでもプレフィックスとサフィックス自体は含まれません)。

Comments

括弧のもう 1 つの使用法は、構文 (?#comment) を介してコメントを含めることです。例: 2[0-4]d(?#200-249)|25[0-5](?#250-255)|[01]?dd?(?#0-199)。

コメントを含めたい場合は、「パターン内の空白文字を無視する」オプションを有効にするのが最善です。これにより、式を記述するときにスペース、タブ、改行を任意に追加できますが、これらは実際に使用されるときに無視されます。このオプションを有効にすると、# に続く行末までのすべてのテキストがコメントとして無視されます。たとえば、前の式を次のように書くことができます:

     (?<=    # 断言要匹配的文本的前缀
      <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
      )       # 前缀结束
      .*      # 匹配任意文本
      (?=     # 断言要匹配的文本的后缀
      <\/>  # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
      )       # 后缀结束

貪欲で怠惰

正規表現に繰り返しを受け入れる修飾子が含まれている場合、通常の動作は (式全体ができるだけ多くの一致を取得するようにするため) です。できるだけ文字で。次の式を例に挙げます: a.*b。これは、a で始まり b で終わる最長の文字列と一致します。これを使用して aabab を検索すると、文字列 aabab 全体と一致します。これを貪欲マッチングと呼びます。

場合によっては、遅延マッチング、つまりできるだけ少ない文字のマッチングが必要になることがあります。上記の修飾子は、後ろに疑問符 ? を追加することで遅延マッチング パターンに変換できます。このように、.*? は、任意の数の繰り返しを一致させますが、全体の一致を成功させるために必要な最小の繰り返し数を使用することを意味します。次に、例の遅延バージョンを見てみましょう:

a.*?b は、a で始まり b で終わる最も短い文字列と一致します。 aababに適用すると、aab(1~3文字目)とab(4~5文字目)が一致します。

最初の一致が ab (2 番目から 3 番目の文字) ではなく aab (1 番目から 3 番目の文字) であるのはなぜですか?簡単に言えば、正規表現には怠惰/貪欲ルールよりも優先度の高い別のルールがあるためです。つまり、最も早く始まる一致が最も高い優先度を持ち、最も早く始まる一致が勝ちとなります。

表 5. 遅延修飾子

QQ截图20161010113322.png

処理オプション

C# では、Regex(String, RegexOptions) コンストラクターを使用して正規表現処理オプションを設定できます。 例: Regex regex = new Regex(@"baw{6}b", RegexOptions.IgnoreCase);

上記では、大文字と小文字の区別や複数行の処理など、いくつかのオプションが導入されています。これらのオプションは、処理を変更するために使用できます。正規表現の方法。以下は、.Net で一般的に使用される正規表現オプションです:

表 6. 一般的に使用される処理オプション

QQ截图20161010113340.png

よくある質問は次のとおりです。同じ時間ですか?答えはいいえだ。これら 2 つのオプションの間には、名前が紛らわしいほど似ていることを除いて、何の関係もありません。

バランス グループ/再帰マッチング

ここで紹介するバランス グループ構文は .Net Framework でサポートされているため、他の言語/ライブラリではこの機能が必ずしもサポートされていないか、この機能はサポートされていても別の構文を使用する必要がある場合があります。

(100 * (50 + 15)) のようなネスト可能な階層構造を照合する必要がある場合、単に (.+) を使用すると、左端の括弧と右端の括弧 () の間の内容のみが一致します。ここでは貪欲モードについて説明していますが、怠惰モードにも次の問題があります)。 (5 / (3 + 2))) のように、元の文字列内の左括弧と右括弧の出現数が等しくない場合、一致結果内の 2 つの括弧の数は等しくなくなります。このような文字列の括弧内にある最長の一致するコンテンツを一致させる方法はありますか?

脳を完全に混乱させる ( と ( ) を避けるために、丸括弧の代わりに山括弧を使用しましょう。ここでの問題は、xx <aa <bbb> <bbb> aa> yy をこのように文字列に入れる方法です。 、最も長い山括弧のペア内のコンテンツをキャプチャしますか?

ここでは次の構文構造を使用する必要があります:

(?'group') キャプチャされたコンテンツにグループという名前を付け、スタック ( Stack) にプッシュします

( ?'-group') 最後にスタックにプッシュされたグループという名前のキャプチャされたコンテンツをスタックからポップします。スタックが元々空の場合、このグループのマッチングは失敗します

(?(group)yes|no) キャプチャ コンテンツがある場合スタック上の名前付きグループ、式の Yes 部分との一致を継続し、それ以外の場合は no 部分との一致を継続します

(?!) ゼロ幅の否定先読みアサーション、サフィックス式がないため、一致しようとすると常に失敗します

あなたがプログラマではない場合 (または、プログラマを自称しているが、スタックが何なのかを知らない場合)、上記の 3 つの構文は次のように理解できます。1 つ目は黒板に「グループ」を書き、2 つ目は黒板に「グループ」を書きます。 3 つ目は、黒板に「グループ」が書かれているかどうかを確認することで、「はい」の部分と一致し、そうでない場合は「いいえ」の部分と一致します。

私たちがしなければならないことは、左括弧に遭遇するたびに「開く」を押し、右括弧に遭遇するたびに「開く」をポップアップし、最後にスタックが空かどうかを確認します - 空でない場合は、それを証明してください。左括弧が右括弧よりも多い場合、一致は失敗するはずです。正規表現エンジンはバックトラックし (最初または最後の文字の一部を破棄し)、式全体との一致を試みます。

<                         #最外层的左括号
    [^<>]*                #最外层的左括号后面的不是括号的内容
    (
        (
            (?'Open'<)    #碰到了左括号,在黑板上写一个"Open"
            [^<>]*       #匹配左括号后面的不是括号的内容
        )+
        (
            (?'-Open'>)   #碰到了右括号,擦掉一个"Open"
            [^<>]*        #匹配右括号后面不是括号的内容
        )+
    )*
    (?(Open)(?!))         #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还有,则匹配失败
>                         #最外层的右括号

バランスのとれたグループの最も一般的な用途の 1 つは、HTML と一致することです。次の例は、ネストされた <div> タグと一致します。<div[^>]*>[^<>]*(( ( (?'開く'<div[^>]*>)[^<>]*)+((?'-開く'</div>)[^<>]*) + )*(?(Open)(?!))</div>.

他に言及されていないもの

正規表現を構築するための多数の要素を上で説明しましたが、まだいくつかの要素があります言及されていないものの多くは言及されています。以下に、言及されていないいくつかの要素のリストを、構文と簡単な説明とともに示します。使用する必要がある場合は、オンラインで詳細なリファレンスを見つけて学習することができます。 MSDN ライブラリをインストールしている場合は、.net で正規表現に関する詳細なドキュメントを見つけることもできます。

ここでの紹介は非常に簡単です。さらに詳細な情報が必要で、コンピューターに MSDN ライブラリがインストールされていない場合は、正規表現言語要素に関する MSDN オンライン ドキュメントを参照してください。

表 7. 構文についてはまだ詳しく説明されていません

QQ截图20161010113405.png

<?php echo "Hello world"; ?>
コースウェア