亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

正規(guī)表現(xiàn)

正規(guī)表現(xiàn)とは一體何ですか?

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

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

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

入門(mén)

正規(guī)表現(xiàn)を?qū)W習(xí)する最良の方法は、例を理解した後、例を自分で変更して実験することです。以下にいくつかの簡(jiǎn)単な例を示し、詳細(xì)に説明します。

英語(yǔ)の小説で hi を検索すると仮定すると、正規(guī)表現(xiàn) hi を使用できます。

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

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

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

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

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

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

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

他のメタキャラクターを同時(shí)に使用すると、より強(qiáng)力な正規(guī)表現(xiàn)を構(gòu)築できます。たとえば、次の例:

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

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

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

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

Metacharacters

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

中國(guó)語(yǔ)/漢字の特殊処理は、.Net が提供する正規(guī)表現(xiàn)エンジンによってサポートされています。その他の環(huán)境での詳細(xì)については、関連ドキュメントを確認(rèn)してください。

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

baw*b は、文字 a で始まる?yún)g語(yǔ)に一致します。最初に単語(yǔ)の先頭 (b)、次に文字 a、次に任意の數(shù)の文字または數(shù)字 (w *)、最後に単語(yǔ)の終わり (b)。

さて、正規(guī)表現(xiàn)內(nèi)の単語(yǔ)の意味について話(huà)しましょう。少なくとも 1 つの連続した w です。はい、これは英語(yǔ)を?qū)Wぶときに覚えなければならない同じ名前の何千ものこととはほとんど関係がありません:)

d+ は 1 つ以上の連続する數(shù)字に一致します。 ここでの + は * に似たメタキャラクターですが、* は任意の回?cái)?shù) (0 回も) 繰り返されたものと一致するのに対し、+ は 1 回以上繰り返されたものと一致する點(diǎn)が異なります。

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

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

QQ截圖20161010113058.png

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

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

{5,12} は、前に紹介した {2} と似ていますが、{2} は 2 回以上もそれ以下も繰り返すことができず、{5,12} は 5 回以上繰り返すことができる點(diǎn)が異なります。 12 回以?xún)?nèi)、それ以外の場(chǎng)合は一致しません。

^ と $ が使用されているため、d{5,12} と一致するには入力文字列全體を使用する必要があります。つまり、入力全體が 5 ~ 12 個(gè)の數(shù)値である必要があるため、入力された QQ 番號(hào)が一致する場(chǎng)合は、この正規(guī)表現(xiàn)が使用されている場(chǎng)合、要件を満たしています。

大文字と小文字を無(wú)視するオプションと同様に、一部の正規(guī)表現(xiàn)処理ツールには複數(shù)行を処理するオプションもあります。このオプションを選択すると、^ と $ の意味が一致する行の開(kāi)始と終了になります。

キャラクターエスケープ

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

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

Repeat

繰り返しを一致させるための以前の *、+、{2}、{5,12} の方法はすでに見(jiàn)てきました。以下は、正規(guī)表現(xiàn)內(nèi)のすべての修飾子です (*、{5,12} など、指定された數(shù)のコード):

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

QQ截圖20161010113118.png

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

Windowsd+ Windows の後に 1 つ以上の數(shù)字が続くものと一致します

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

文字クラス

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

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

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

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

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

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

分岐條件

殘念ながら、今の式は 010)12345678 や (022-87654321) などの「間違った」形式にも一致する可能性があります。分岐條件を使用する必要があります。正規(guī)表現(xiàn)では、複數(shù)のルールを參照します。そのいずれかが一致した場(chǎng)合、異なるルールを | で區(qū)切る必要があります。例:

0d{2}-d {8}|0d{3}-d{7} この式は、ハイフンで區(qū)切られた 2 つの電話(huà)番號(hào)と一致します。1 つは 3 桁の市外局番と 8 桁の市外局番 (010-12345678 など)、もう 1 つは電話(huà)番號(hào)です。 4 桁の市外局番と 7 桁の市內(nèi)番號(hào) (0376-2233445)。

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

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

グループ

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

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

IP アドレスの各數(shù)字は 255 を超えることはできません?!?4」の第 3 シーズンの腳本家に騙されないでください...

殘念ながら、これはあり得ない IP アドレス 256.300.888.999 にも一致します。算術(shù)比較を使用できる場(chǎng)合は、この問(wèn)題を簡(jiǎn)単に解決できる可能性がありますが、正規(guī)表現(xiàn)では數(shù)學(xué)関數(shù)が提供されないため、正しい IP アドレスを記述するには、長(zhǎng)いグループ化、選択、および文字クラスのみを使用できます:( (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

場(chǎng)合によっては、単純に定義された文字クラスに屬さない文字を検索する必要があります。たとえば、數(shù)字以外の文字を検索したい場(chǎng)合は、次の反意語(yǔ)を使用する必要があります。

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

ええと...実際、グループ番號(hào)の割り當(dāng)ては、先ほど述べたほど単純ではありません:

グループ 0 は正規(guī)表現(xiàn)全體に対応します

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

(?:exp) のような構(gòu)文を使用して、グループ ペアを解除できますグループ番號(hào)割り當(dāng)ての參加権。

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

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

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

かっこを使用する場(chǎng)合、特殊な目的の構(gòu)文が多數(shù)あります。最も一般的に使用されるもののいくつかを以下に示します。

表 4. 一般的なグループ化構(gòu)文

QQ截圖20161010113211.png

ゼロ幅アサーション

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

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

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

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

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

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

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

負(fù)のゼロ幅アサーション

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

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

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

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

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

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

Comments

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

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

     (?<=    # 斷言要匹配的文本的前綴
      <(\w+)> # 查找尖括號(hào)括起來(lái)的字母或數(shù)字(即HTML/XML標(biāo)簽)
      )       # 前綴結(jié)束
      .*      # 匹配任意文本
      (?=     # 斷言要匹配的文本的后綴
      <\/>  # 查找尖括號(hào)括起來(lái)的內(nèi)容:前面是一個(gè)"/",后面是先前捕獲的標(biāo)簽
      )       # 后綴結(jié)束

貪欲で怠惰

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

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

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

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

表 5. 遅延修飾子

QQ截圖20161010113322.png

処理オプション

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

上記では、大文字と小文字の區(qū)別や複數(shù)行の処理など、いくつかのオプションが導(dǎo)入されています。これらのオプションは、処理を変更するために使用できます。正規(guī)表現(xiàn)の方法。以下は、.Net で一般的に使用される正規(guī)表現(xiàn)オプションです:

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

QQ截圖20161010113340.png

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

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

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

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

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

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

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

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

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

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

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

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

<                         #最外層的左括號(hào)
    [^<>]*                #最外層的左括號(hào)后面的不是括號(hào)的內(nèi)容
    (
        (
            (?'Open'<)    #碰到了左括號(hào),在黑板上寫(xiě)一個(gè)"Open"
            [^<>]*       #匹配左括號(hào)后面的不是括號(hào)的內(nèi)容
        )+
        (
            (?'-Open'>)   #碰到了右括號(hào),擦掉一個(gè)"Open"
            [^<>]*        #匹配右括號(hào)后面不是括號(hào)的內(nèi)容
        )+
    )*
    (?(Open)(?!))         #在遇到最外層的右括號(hào)前面,判斷黑板上還有沒(méi)有沒(méi)擦掉的"Open";如果還有,則匹配失敗
>                         #最外層的右括號(hào)

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

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

正規(guī)表現(xiàn)を構(gòu)築するための多數(shù)の要素を上で説明しましたが、まだいくつかの要素があります言及されていないものの多くは言及されています。以下に、言及されていないいくつかの要素のリストを、構(gòu)文と簡(jiǎn)単な説明とともに示します。使用する必要がある場(chǎng)合は、オンラインで詳細(xì)なリファレンスを見(jiàn)つけて學(xué)習(xí)することができます。 MSDN ライブラリをインストールしている場(chǎng)合は、.net で正規(guī)表現(xiàn)に関する詳細(xì)なドキュメントを見(jiàn)つけることもできます。

ここでの紹介は非常に簡(jiǎn)単です。さらに詳細(xì)な情報(bào)が必要で、コンピューターに MSDN ライブラリがインストールされていない場(chǎng)合は、正規(guī)表現(xiàn)言語(yǔ)要素に関する MSDN オンライン ドキュメントを參照してください。

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

QQ截圖20161010113405.png

學(xué)び続ける
||
<?php echo "Hello world"; ?>
提出するリセットコード