30分で正規表現が何かを理解し、基本的な使い方が分かるようにします。自分のプログラムやウェブページで使えるようになります。
正則表現30分間の入門(mén)講座 本文の目的 このチュートリアルを使う方法 正規表現とは何か? 初心者 正則表現式をテストします。 メタシンボル 文字エスケープ 繰り返す 文字種類(lèi) 分岐條件 グループ分け 反対(はんたい) 後向參照 零広斷言(りょうきょうだんげん) 負向零幅広斷言(ふぞうれいぞくかくだんせい) 注釈 貪欲と怠惰 選択肢を処理します。 バランスグループ/再帰マッチング 何か言及されていないことがありますか? 著(zhù)者に連絡(luò )してください。 オンラインのリソースおよび本文の參考文獻
下記の複雑な表現に恐れをなさる必要はありません。私のステップに従えば、正規表現が想像以上に難しくないことに気づくでしょう。もちろん、このチュートリアルを読み終わった後、多くを理解したことに気づいてもほとんど何も思い出せないこともあるでしょう——私は考えますが、正規表現に初めて觸れる人にとって、この
最も大切なのは——お願いします 30分 もし正規表現の経験がなければ、30分以?xún)趣嗽嚖撙胜い扦坤丹ぁ? 秒:秒(びょう) 內門(mén) - 除非君がスーパーマンです :P
この記事は、初心者向けのチュートリアルだけでなく、日常業(yè)務(wù)で使える正則表現の文法リファレンスを目指しています。著(zhù)者の経験から言えば、この目標は達成されています。自分自身も全てを覚えることはできていないでしょう。
フォーマットをクリアしてください。 テキストフォーマットの約定: 専門(mén)用語(yǔ) メタキャラクター/文法フォーマット 正規表現 正規表現式の一部(分析用) マッチングする元文字列 正則表現式またはその一部の説明 。
注釈を隠す 本文右にいくつかの注釈があります。主に関連情報を提供したり、プログラマーの背景がない読者に基本的な概念を説明するために用いられています。通常は省略できます。
プログラムやウェブページで文字列を扱う際、特定の複雑なルールに合致する文字列を検索することがよくあります。 正規表現 これらのルールを記述するツールです。別の言い方をすると、正規表現はテキストのルールを記録するコードです。
Windows/Dosでファイル検索に使ったものかも。
ワイルドカード(通配符)
wildcard
)
つまり、
*
「わ」
?
特定のディレクトリ內のすべてのWordドキュメントを探す場(chǎng)合、以下のように検索します:特定のディレクトリ內のすべてのWordドキュメントを検索します。
*
.doc
ここに、
*
任意の文字列として解釈されます。ワイルドカードと同様に、正規表現もテキストのマッチングに使われるツールですが、ワイルドカードより詳細な條件を指定できます。ただし、複雑さが増します。例えば、特定のパターンを探すための正規表現を書(shū)くことができます。
すべて0で始まり、その後2~3桁の數字が続き、ハイフン「-」があり、最後に7または8桁の數字が続く文字列
像: 似に
010-12345678
「または」
0376-7654321
)。
文字 文字処理の基本単位で、文字、數字、記號、スペース、改行、漢字などが含まれる。 文字列 0文字以上のシーケンスです。 テキスト 文字、文字列とも呼ばれる。ある文字列について語(yǔ)る。 一致です 正規表現は、文字列の中で特定の部分(または複數の部分)が條件を満たすことを示す表達式です。
正規表現を學(xué)ぶ最良の方法は、例から始め、例を理解して自分で修正し、実験することです。以下に多くの簡(jiǎn)単な例が示され、詳細に説明されています。
仮にあなたが英文の小説の中で探していると仮定します。 hi 正規表現を使用できます。 hi 。
これはほぼ最も簡(jiǎn)単な正規表現で、以下のような文字列を正確に一致させます: 二文字で、最初は「h」、二つ目は「i」 通常、正規表現を処理するツールは大文字小文字を區別しないオプションを提供します。これを選択すると、それが一致させることができます。 hi , HI , Hi , hI どれでも可。
殘念ながら、多くの単語(yǔ)には含まれています。 hi この連続した記號、例えば him , history , high ちょっと待って。 hi 探すと、ここには hi 見(jiàn)つかることもあります。もし… 正確に「hi」という単語(yǔ)を探してください。 それでは、~を使用するべきです。 \bhi\b 。
\b
正規表現で定義された特別なコードです(いいえ、誰(shuí)かが呼んでるんですけど)
メタキャラクター
metacharacter
)、代表しています。
単語(yǔ)の先頭または末尾、つまり単語(yǔ)の分かれ目です。
しかし、通常英語(yǔ)の単語(yǔ)はスペース、記號、または改行で區切られているが、
\b
これらの単語(yǔ)分離文字のいずれにも一致しません。
一箇所だけ一致させる
。
仮にあなたが探しているのは こんにちは、そのすぐ後ろにはLucyがいます あなたは使うべきです \bhi\b.*\bLucy\b 。
より正確な表現が必要です。 \b その位置は、その前の文字と後の文字がどちらも(いずれも)一致しない場(chǎng)合です:あるのは、あるのはない場(chǎng)合も含みます。 \w 。
ここでは、.は別のメタキャラクターであり、一致させる。 任意の文字(改行符以外) 同じく、マッチキャラクターですが、文字や位置ではなく、數量を指定しています。 * 前の內容を何度も繰り返して、全體の表現が一致するようにできます。 それゆえ、. * 連結することで、改行を含まない任意數の文字が結びつくことになります。 今(いま) \bhi\b. * \bLucy\b その意味は明らかです: ハイ 任意文字列(改行不可)Lucy 。
他のメタキャラクタを同時(shí)に使用することで、より強力な正規表現を構築できます。例えば以下の通りです:
0\d\d-\d\d\d\d\d\d\d\d このような文字列を一致させる: 0で始まり、2桁、ハイフン、8桁 それ即ち中國の電話(huà)番號です。もちろん、この例は3桁の地域コードにのみ一致します。
換行符就是'\n',ASCII編碼為10(十六進(jìn)制
0x0A
)の文字。
ここに \d 新しいメタキャラクタ、一致します 一つの數値(0、または1、または2、または……) )。- 元文字列ではありません。そのままのハイフン(またはマイナス、または短縮線(xiàn)など、どのように呼んでもかまいません)。
多くの煩わしい重複を避けるために、この表現をこんなように書(shū)くこともできます: 0\d{2}-\d{8} ここに \d 後ろの{ 2 }({ 8 })の意味は、前の文のことです。 \d 連続して2回(8回)一致させる必要があります 。
正則表現式が読み書(shū)きが難しくないと感じないなら、天才か地球外の人間でしょう。文法が厄介で、使い慣れても難しいです。読み書(shū)きが難しくて間違えやすいので、テストツールを使うのは重要です。
他のテストツール:
異なる環(huán)境では正規表現の詳細が異なります。このチュートリアルでは、マイクロソフト .Net Framework 4.0における正規表現の動(dòng)作を紹介していますので、.Net向けのツールを私が作成したことをお勧めします。 正規表現テストツール このページの説明に従ってソフトウェアをインストールおよび実行してください。
以下は、Regex Testerの実行時(shí)のスクリーンショットです:
今あなたはいくつかの非常に役立つメタキャラクターを知っています、たとえば \b , . , * , そして \d 正規表現にはさらに多くのメタキャラクターがあります、例えば \s 一致です 任意の空白文字、空格、タブ、改行文字、全角スペース等を含む 。 \w 一致です アルファベットまたは數字または下線(xiàn)または漢字など 。
以下、より多くの例を見(jiàn)てみましょう:
\ba\w * \b 一致させるためのアルファベット a 単語(yǔ)の先頭部分ーーある単語(yǔ)が始まる場(chǎng)所 \b ),その後はアルファベットです a それから、任意の數の文字または數字( \w * ),最後に単語(yǔ)の終わり( \b )。
.Netの正則表現エンジンが漢字/中國語(yǔ)の特別な処理をサポートしています。他の環(huán)境における詳細は、関連文書(shū)を參照してください。
了解しましたね、正規表現の単語(yǔ)について話(huà)しましょう:少なくとも1つの連続する\wです。いいですね、これは英文を學(xué)ぶときに覚える何千もの同じ名前のものとはあまり関係がありませんよ :)
\d+ 一致です 1つまたは複數の連続數字 ここに + はと * 似たようなメタチャラクター、ただし異なるのは * 任意回數(0回も可)で一致 + 則一致(そくてき) 繰り返し1回以上 。
\b\w{6}\b 一致です 正に6文字の単語(yǔ) 。
コード | 説明 |
---|---|
. | 任意文字を一致させる(改行符を除く) |
\w | アルファベットまたは數字またはアンダースコアまたは漢字と一致 |
\s | 任意の空白文字に一致します |
\d | 數字一致に合わせる |
\b | 単語(yǔ)の開(kāi)始または終了に一致 |
^ | 文字の一致部分の先頭を照合する |
$ | 文字列の終了が一致します |
メタシンボル ^ (數字6と同じキーに配置されている記號)と $ すべての位置に一致、これは \b 少し似ている。 ^ 検索する文字列の先頭に一致するように設定してください。 $ このコードは、入力內容の検証に非常に役立ちます。たとえば、ウェブサイトでQQ號碼が5桁から12桁の數字で入力する必要がある場(chǎng)合、以下のように使用できます: ^\d{5,12}$ 。
ここに{ 5,12 } そして、前に紹介された{ 2 同じように、ただし{ 2 マッチング しかしながら、2回だけ繰り返します ,{ 5,12 それでは 繰り返し回數は5回未満でないこと、12回を超えないこと それとも一致しません。
正規表現エンジンは、JavaScriptのように「指定された文字列が正規表現に一致するかどうかをテストする」メソッドを提供します。
RegExp.test()
方法や.NETのRegex.IsMatch()メソッド。ここでの「マッチ」は、文字列に表記された規則に一致する部分があるかどうかを指します。使わない場(chǎng)合 ^ 「わ」 $ のこと、について \d{5,12} その方法を使うと、文字列に含まれることが保証されます。 5から12までの連続する數字 それが5から12桁の數字だけではなく、整個(gè)字符串です。
因使用して ^ 「わ」 $ したがって、入力された整個(gè)文字列を使って \d{5,12} 來(lái)匹配、すなわち全ての入力が 5~12の數字 それゆえ、入力されたQQ號碼がこの正規表現に一致すれば、要件を満たします。
大文字小文字を區別しないオプションと同様に、一部の正規表現処理ツールには、複數行を処理するオプションがあります。このオプションが有効になると、 ^ 「わ」 $ 意味は変わることになります 行の始端と終端の一致 。
元文字自身を探そうとすると、.や*のような場(chǎng)合、問(wèn)題が発生します:それらを指定することができません。なぜなら、それらは別の意味と解釈されるからです。そのためには、\を使ってその文字の特殊な意味を解除する必要があります。したがって、あなたは使うべきです: . 「わ」 \ * もちろん、「\」そのものを見(jiàn)つけるには、\を使う必要があります。 \ \ .
例えば:
unibetter
\
.com
一致です
unibetter.com
,
>C:
\
Windows
一致です
C:\Windows
。
前を見(jiàn)てきました * , + , {2} , {2,5} これらの一致方法は重複しています。以下は、正規表現中のすべての限定子(例えば、*, {5,12}などの指定數量のコード)です:
コード/文法 | 説明 |
---|---|
* | 何もしない場(chǎng)合も可 |
+ | 繰り返し1回以上 |
? | 零回または一度 |
{n} | n回繰り返す |
{n,} | 繰り返しn回以上 |
{m,m} | nからmまで繰り返します |
以下は、繰り返しの例です:
Windows\d+ 一致です Windows後に1個(gè)以上の數字が続く。
^\w+ 一致です 一行的最初の単語(yǔ)(または全體の最初の単語(yǔ)、どちらをマッチさせるかはオプションの設定による)
數字やアルファベット、スペースを検索するのは簡(jiǎn)単です。それらの文字に対応していますから。 * * のメタ文字、しかしプレデファインドメタ文字を持たない文字を一致させる場(chǎng)合は * * (たとえば、母音文字a、e、i、o、u)、どうすればよいですか?
単純です。方括號に入力すれば、そのままになります。 [aeiou] 一致です どの英語(yǔ)の母音文字も , [.?!] 一致です ...?.! 。
指定するのも簡(jiǎn)単です 範囲 ,まるで [0-9] 代表の意味と \d 全く一致です: 一位數數字 同様に [a-z0-9A-Z_] 全く同じです \w (英語(yǔ)だけで考えれば)。
以下はより複雑な表現です: \ (?0\d{2}[) -]?\d{8} 。
この表現は一致させることができます 複數のフォーマットの電話(huà)番號 ,まるで (010)88886666 、または 022-22334455 、または 02912345678 待ちましょう。それについて少し分析してみましょう:まずはエスケープシーケンスから始めましょう。 \ (, 0回もしくは1回でもよい。 ? ),その後は、 0 、後ろに2つの數字が続きます。 \d{2} ),それから)または-または スペース その中で、1回出現または出現しない ? ),最後に8桁の數字( \d{8} )。
「(」および「)」もメタキャラクターであり、後ろの 分群祭(ぶんぐんさい) ここでは觸れられるため、ここでは使用する必要があります。 エスケープ 。
殘念ながら、その表現も一致しました。 010)12345678 「または」 (022-87654321 この「不正確」なフォーマットを解決するには、以下の方法が必要です。 分岐條件 正規表現の中で 分岐條件 ある種のルールが複數あって、そのうちのいずれかを満たせばマッチとする。ルールは「|」で區切る。理解できなかった?大丈夫、例を見(jiàn)てみよう:
0\d{2}-\d{8}|0\d{3}-\d{7} この表現は 電話(huà)番號を以下の形式で一致させる:③桁の地域コード+⑧桁のローカルコード(例:010-12345678)、または④桁の地域コード+⑦桁のローカルコード(例:0376-2233445) 。
\ (0\d{2} ) [- ]?\d{8}|0\d{2}[- ]?\d{8} この表現 電話(huà)番號は3桁の地域コードと一致し、地域コードは括弧で囲むか、囲まないかに関わらず、地域コードと市外局番の間にはハイフンまたはスペースが入るかどうかに関わらず、入らないこともあります。 .この表現を枝分かれ條件を使って4桁の電話(huà)番號にも対応できるようにしてみてください。
\ d{5}-\d{4}|\d{5} この表現はアメリカの郵便番號をマッチングするために使われます。アメリカの郵便番號のルールは、5桁の數字またはハイフンで區切られた9桁の數字です。この例を挙げるのは、それが問(wèn)題點(diǎn)を説明するからです: 分枝條件を使用する際は、各條件の順序に注意してください。 それを変更すると、 \ 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}
一致です
三位數+英文句點(diǎn)(その全體はこれです)
グループ分け
繰り返します。
最後に、それに加えて
1?3桁の數字
\
d{1,3}
)
。
不運的是、それも一致します
256.300.888.999
存在しないIPアドレスです。算術(shù)的な比較ができるなら、問(wèn)題を簡(jiǎn)単に解決できるかもしれませんが、正規表現には數學(xué)的な機能が提供されていないので、長(cháng)いグループ、選択、文字クラスを使用して正しいパターンを記述するしかありません。
IP
住所:
((2[0-4]\d|25[0-5]|[01]?\d\d?)
\
.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
。
IPアドレスの各數字は255以下でなければなりません。ぜひ「24」シーズン3の腳本家に騙されないでください……
この表現を理解する鍵は、その表現を理解することです。 2[0-4]\d|25[0-5]|[01]?\d\d? ここでは詳しく説明は省きます。あなたは意味を理解できるでしょう。
ある時(shí)は、簡(jiǎn)単に定義できる文字クラスに屬さない文字を検索する必要があります。例えば、數字以外の全ての文字を検索したい場(chǎng)合、以下の方法を使います。 反対(はんたい) :
コード/文法 | 説明 |
---|---|
\W | 任意のアルファベット、數字、アンダースコア、漢字でない文字を一致させます |
\S | 任意非空白文字の一致 |
\D | 任意非數字文字の一致 |
\B | 一致しない単語(yǔ)の先頭や末尾の位置 |
[^x] | 任意文字以外の一致 |
[^aeiou] | あいおう以外の文字を一致させる |
例: \S+ 空白符なしの文字列を一致させます。
<a[^> ] +> 尖括號で括まったaで始まる文字列を一致させる。
小括號で指定された子式が、 該子表現式と一致するテキスト (このグループが捉えた?jì)热荬猓┍憩Fや他のプログラムでさらなる処理ができます。デフォルトでは、各グループには自動(dòng)的に一つの グループNo. ルールは:左から右に並べ、左括弧でグループを示し、最初に現れるグループの番號は1、次は2と順に増やします。
後向參照 前に一致したグループのテキストを繰り返し検索する。例えば、 \1 代表:代表者(だいひょうしゃ) グループ1でマッチしたテキスト 理解に難しいですか?例を見(jiàn)てください。
\b(\w+)\b\s+\1\b 重複の単語(yǔ)を一致させるために使える、みたいです go go 、または kitty kitty この表現はまず、 一つの単語(yǔ) つまり、 単語(yǔ)の先頭と末尾の間に2つ以上のアルファベットまたは數字が含まれる (\b(\w+)\b) その単語(yǔ)は、その後1番のグループに分類(lèi)されます。 1個(gè)または複數の空白シンボル ( \s+ ),最後に、 グループ1で捕獲された?jì)热荩à膜蓼晗趣郅梢恢陇筏繀g語(yǔ)) \1 ) 。
実は、グループの割り當ては私が言ったほど単純ではありません:
- グループ0は全體の正規表現に対応します。
- 実際にはグループ番號の割り當てプロセスは左から右に2回スキャンします:まず1回目で名前がついていないグループに割り當て、2回目で名前がついているグループに割り當てます。したがって、すべての名前がついているグループの番號は名前がついていないグループの番號よりも大きいです。
- (?:exp)のような文法を使って、一つのグループがグループ番號の割り當てに參加する権利を剝奪できます。
子表現式を自分で指定することもできます。 グループ名 子表現式グループ名を指定する場(chǎng)合は、以下の構文を使用してください: ? < Word>\w+ )(或者把尖括號換成'也行:( ?'Word'\w+ ),これで \w+ のグループ名を指定します。 Word 分組を逆參照します。 捕まえる の內容、あなたは使用できます \k < Word> したがって、前の例はこんな風(fēng)にも書(shū)ける: \b(? < Word>\w+)\b\s+\k < Word>\b 。
小括號の使い方には、多くの特定の文法がある。以下に最もよく使われるものを挙げる。
xxxxxxxxxx
分類(lèi) 代碼/語(yǔ)法 説明
-----------------------------------------------------------------------------------------
(exp) 匹配exp,并捕獲文本到自動(dòng)命名的組里
捕獲 ? ? (?<name>exp) ? 匹配exp,并捕獲文本到名稱(chēng)為name的組里,也可以寫(xiě)成(?'name'exp)
? ? ? (?:exp) 匹配exp,不捕獲匹配的文本,也不給此分組分配組號
-----------------------------------------------------------------------------------------
(?=exp) ? ? ? ? ? 匹配exp前面的位置
零広斷言(りょうきょうだんげん) ? ? ? (?<=exp) ? ? ? ? 匹配exp后面的位置
? ? ? ? ? ? ? ? (?!exp) 匹配后面跟的不是exp的位置
? ? ? ? ? ? ? ? (?<!exp) 匹配前面不是exp的位置
-----------------------------------------------------------------------------------------
注釈 (?#comment) ? 這種類(lèi)型的分組不對正則表達式的處理產(chǎn)生任何影響,用于提供注釋
すでに前兩種文法について議論しました。第3の( ?:exp 正規表現式の処理方法を変えません。ただし、このようなグループは前の2つのグループのようにキャプチャされず、グループ番號もありません?!挨胜激饯韦瑜Δ摔筏郡い韦??”——素晴らしい質(zhì)問(wèn)です、どう思いますか?
次の四つの単語(yǔ)は、特定の內容(それらの內容を含まない)の前後にあるものを探すために使われます。つまり、それらは似ていますね。 \b , ^ , $ そのように位置を指定し、その位置が特定の條件(つまり斷言)を満たすべきであるため、それらはまた...と呼ばれます 零広斷言(りょうきょうだんげん) 例を示すのが一番わかりやすいでしょう:
(?=exp)
もしくは
零幅広正予測先行斷言
、それ
自身の位置の後でexpと一致する文を主張
例えば
\b\w+(?=ing\b)
,一致に
ing
結尾の単語(yǔ)の前半部分(除く)
ing
以降(いこう))
,如検索
I'm
singing while you're
dancing.
その時(shí)、それが一致します
sing
「わ」
danc
。
(?<=exp)
もしくは
零幅広正逆後発斷言
、それ
自身の位置が表す前の部分が表現expに一致することを斷言します
たとえば(
?<=\bre)\w+\b
一致するべき
「re+」で始まる単語(yǔ)の後半部分(「re」以外の部分)
例えば、検索する際に
reading
a book
その時(shí)、一致します
ading
。
地球人、これらの専門(mén)用語(yǔ)が複雑で覚えにくいと思いませんか?私も同じ感じです。その存在を知っていれば良い、名前はどうでもいいです。人間に名前がなければ剣の修行に集中できます;物に名前がなければ自由に選べます……
斷言は真であるべき事実を宣言する。正規表現では、斷言が真でないと続行しません。
もし、非常に長(cháng)い數字に3桁ごとにカンマを入れる場(chǎng)合、以下のようにカンマを入れるべき場(chǎng)所を探すことができます: ((?<=\d)\d{3})+\b それを使って 1234567890 検索結果は 234567890 。
この例では、この二つの斷言が同時(shí)に使用されています。 (?<=\s)\d+(?=\s) 一致です 空白記號で區切られた數字(再確認しますが、これらの空白記號は含まないでください) 。
前にお話(huà)しした通り、どう探すか 特定の文字または文字クラスに屬していない 文字の方法(反対)。しかし、もし私たちは単に 特定の文字が含まれないことを確認するが、その文字をマッチングするつもりはない どうすればいいですか?例えば、このような単語(yǔ)を探したいときは、例えば、qの後にuが続かない単語(yǔ)を探す場(chǎng)合は、こんな方法を試してみましょう:
\b\w * q [ ^u ] \w * \b 一致です 含む(ふくむ) ク以外のアルファベットのキュー の単語(yǔ) .しかし、もっとテストをしたり(またはあなたの思考が鋭ければ、直接観察でわかるかもしれないが)、qが単語(yǔ)の末尾に現れると、像 Iraq , Benq この表現がエラーになるのは、そのためです。 [^u] 總は一文字は一致させる必要があるため、qが単語(yǔ)の最後の文字であれば、後ろに [ ^u] qの後の単語(yǔ)區切り(スペース、ピリオドなどが考えられる)を一致させる予定です \w * \b 次の単語(yǔ)を一致させるため、です。 \b\w * q [ ^u]\w * \b 全體を一致させることができる Iraq fighting 。 負向零幅広斷言(ふぞうれいぞくかくだんせい) この問(wèn)題を解決できるのは、その位置を1つだけマッチングするからです。 消費 どんな文字でも。今やこの問(wèn)題をこのように解決できます: \b\w * q(?!u)\w * \b 。
零幅広負予測先行斷言
(?!exp)
,
この位置の後でexpression expはマッチしませんと斷言します
例えば:
\d{3}(?!\d)
三桁の數字が一致です。それで
三桁の數字の後ろは數字ではありません
;
\b((?!abc)\w)+\b
一致です
連続した文字を含まない
abc
の単語(yǔ)
。
同様に、私たちは使えます (?<!exp) , 零幅広負後回帰斷言 來(lái)ます。 この位置の前にexpression expはマッチしませんと斷言します : (?<![a-z])\d{7} 一致です 前頭の7桁の數字は小文字ではありません 。
一例も複雑なもの: (?<=<(\w+)>). * (?=<\/\1>) 屬性なしの簡(jiǎn)単なHTMLタグ內の內容をマッチング 。 (?<=<(\w+)>) 指定したような 接頭辭 : <角括號>括った単語(yǔ) たとえば、それはかもしれない。 < b>),然后是 .* (任意の文字列),最後に一つがつきます 接尾辭 (?=<\/\1>) 注意接尾語(yǔ)に. \/ 前述のキャラクターエスケープを使用しています。 \1 それは逆引用で、引用されているのは 初めに捕まえたもの ,前にの (\w+) マッチングされた?jì)热?、もし接頭辭が実際には < b>的話(huà),后綴就是 < /b>了。整個(gè)表達式匹配的是 < b>和 < /b>之間的內容(再次提醒,不包括前綴和后綴本身)。
表達式を詳細に分析してください。 (?<=<(\w+)>). * (?=<\/\1>) この表現が零幅斷言の真の用途を最もよく表している。
小括號の別の用途は、文法を通じてです。 (?#comment) 來(lái)含めます。 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199) 。
コメントを含める場(chǎng)合、「スペース文字を無(wú)視するモード」のオプションを有効にすると良いでしょう。これにより、式を記述する際に自由にスペース、タブ、改行を追加できますが、実際の使用ではこれらは無(wú)視されます。このオプションを有効にすると、#以降の行末までのすべてのテキストがコメントとして無(wú)視されます。例えば、以下のように
(?<= | # テキストの前綴と一致する斷言を行う |
<(\w+)> | # <角括號で囲まれた文字または數字(HTML/XMLタグ)を検索する |
) | 接続子終了 |
.* | 任意テキストにマッチ |
(?= | # テキストの接尾辭を一致させる斷言 |
<\/\1> | # 查找尖括號括起來(lái)的內容:前面是一個(gè)"/",后面是先前捕獲的標簽 |
) | # エンディングシーケンス |
正規表現式中、繰り返し限定子が含まれる場(chǎng)合、通常の行動(dòng)は(全體の表現式が一致する前提で)一致させることです。
できるだけ多く
の文字。この表現を例にして:
a.
*
b
それが一致させるでしょう
最長(cháng)でaで始まりbで終わる文字列
それを使って検索する場(chǎng)合
aabab
それで、全體の文字列が一致します。
aabab
これは「~と呼ばれる」と言います。
貪欲
マッチ。
時(shí)に、私たちはもっと必要とします 怠けたくなる マッチング、つまりマッチング できるだけ少なく の文字。先に示された限定子は、その後ろに疑問(wèn)符を加えることで、遅い一致モードに変換できます。 ? これはですね。 .*? それゆえに 任意數の重複をマッチするが、全體のマッチを成功させるために最小の重複を使用します 今、怠け者の例を見(jiàn)てみましょう:
a.
*
?b
一致です
最短で、aで始まり、bで終わる文字列
それを適用すると、
aabab
のなら、一致します
aab
(第一から第三文字)
「わ」
AB(第4~5文字)
。
コード/文法 | 説明 |
---|---|
*? | 何度でも繰り返せるが、できるだけ少なく |
+? | 繰り返し1回以上、できるだけ少なく |
?? | 0回または1回、できるだけ少なく重複 |
{n,m}? | nからmまで繰り返すが、できるだけ少なく |
{n,}? | 「n回以上繰り返し、できるだけ少なく」 |
なぜ最初の一致はaab(最初から3番目の文字)であって、ab(2番目から3番目の文字)ではないのか?簡(jiǎn)単に言うと、正規表現には他のルールがあり、懶惰/貪婪ルールよりも優(yōu)先度が高い:最初に始まる一致が最も高い優(yōu)先権を持っているからだ - The match that begins earliest wins。
上記でいくつかのオプション、例えば大文字小文字を區別しない、複數行を処理するなどが紹介されました。これらのオプションは正規表現の処理方法を変更するために使えます。以下は.NETでよく使われる正規表現オプションです:
名稱(chēng):名稱(chēng)(めいしょう) | 説明 |
---|---|
IgnoreCase
無(wú)視します。
|
大文字小文字を區別しないマッチング |
Multiline
マルチラインモード
|
変更 ^ 「わ」 $ の意味で、任意の行の先頭と末尾に一致させる。単に全文の先頭と末尾に一致させるのではなく、(このモードでは、) $ の正確な意味は:マッチする位置と文字列の終わりまでの位置です。 |
Singleline
(単一行モード)
|
文字列の意味を変更し、全ての文字(改行符\nも含む)に一致させる。 |
IgnorePatternWhitespace
(空白を省略)
|
非変換スペースを無(wú)視して、有効にします。 # マークのコメント |
ExplicitCapture
(明示キャッチ)
|
明示的に名前付けられたグループのみキャッチ |
よく質(zhì)問(wèn)されるのは、多行モードと単行モードは同時(shí)に使えるのかです。答えは、違います。これらのオプションは名前が似ているだけで(混亂させるためか)、他には何の関係もありません。
C#で使えるのは Regex(String, RegexOptions)コンストラクタ 來(lái)設置正則表達式的處理選項。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
時(shí)には、像のように一致させる必要があります。 ( 100 * ( 50 + 15 ) ) そのような入れ子になった階層構造は、単純に使用 \ (.+ \ ) 左側の左括號と右側の右括號の間の內容だけが一致します(ここでは、強制一致モードについて説明していますが、遅延一致モードでも同様の問(wèn)題があります)。元の文字列の左括號と右括號の數が一致しない場(chǎng)合、例えば ( 5 / ( 3 + 2 ) ) ) それでは、両者の數は等しくないでしょう。そのような文字列の中で最も長(cháng)い括弧內の內容をどうやってマッチングできるのでしょうか?
ここで紹介されるバランス構文は.Net Frameworkでサポートされています;他の言語(yǔ)/ライブラリではこの機能がサポートされていないか、またはサポートされている場(chǎng)合でも異なる構文が必要です。
避けます ( 「わ」 \ ( 脳を完全に混亂させましょう。今や問(wèn)題は、角括號で丸括號を置き換える方法についてです。 xx aa> yy その文字列の中で最も長(cháng)い括弧內の內容を取得する?
ここでは以下の文法構造が必要です。
(?'group') 捕獲した?jì)热荬颉竒roup」と名付け、プッシュしてください。 スタック(Stack)
(?'-group') スタックから最後にpushされた名前がgroupのキャプチャ內容をpopし、スタックが既に空であれば、このグループのマッチングが失敗します。
(?(group)yes|no) グループのキャプチャがスタックにある場(chǎng)合、yes部分の表達式に続いてマッチングします。そうでない場(chǎng)合は、no部分に続いてマッチングします。
(?!) 零幅否定先行斷言、後続表現式なし、常に失敗します
我們需要做的是每碰到了左括號,就在壓入一個(gè)"Open",每碰到一個(gè)右括號,就彈出一個(gè),到了最后就看看堆棧是否為空--如果不為空那就證明左括號比右括號多,那匹配就應該失敗。正則表達式引擎會(huì )進(jìn)行回溯(放棄最前面或最后面的一些字符),盡量使整個(gè)表達式得到匹配。
如果你不是一個(gè)程序員(或者你自稱(chēng)程序員但是不知道堆棧是什么東西),你就這樣理解上面的三種語(yǔ)法吧:第一個(gè)就是在黑板上寫(xiě)一個(gè)"group",第二個(gè)就是從黑板上擦掉一個(gè)"group",第三個(gè)就是看黑板上寫(xiě)的還有沒(méi)有"group",如果有就繼續匹配yes部分,否則就匹配no部分。
xxxxxxxxxx
< ? ? ? ? ? ? ? ? ? ? ? ? 最外層の左括弧
[^<>]* ? ? ? ? ? ? ? ?最外層の左括號の後ろに括號のない內容があります。
(
(
(?'Open'<) ? ?左括號に遭遇したら、黒板に「Open」を書(shū)く。
[^<>]* ? ? ? ?左括號の後ろに括號でない內容をマッチする
)+
? ? (
? ? (?'-Open'>) ? ?右括號に當たったら「オープン」を一つ消す
? ? ? [^<>]* ? ? ? ?# 括號の後ろに括號でない內容をマッチする
)+
? ? )*
? ? ? ? (?(Open)(?!)) ? 最外層の右括弧の前に「Open」が黑板に殘っていないか確認;あれば、マッチング失敗
?
? ? ? ? ? > ? ? ? ? ? ? ?最外層の右括弧
バランスグループの最も一般的な応用例はHTMLのマッチングです。以下の例では、ネストされたものをマッチングできます。 < div>標簽: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>
上記で正規表現の構築に必要な多くの要素が記述されていますが、言及されていないものも多數あります。以下に、その中の一部を含む要素のリストとその文法および簡(jiǎn)単な説明を挙げます。詳細な情報を學(xué)ぶためには、オンラインでより詳しいリソースを探してください-必要に応じて。MSDN Libraryをインストールしていても、.NETの
コード/文法 | 説明 |
---|---|
\a | 警報文字(コンピュータが「ディー」と鳴る効果) |
\b | 通常は単語(yǔ)の區切り位置ですが、文字クラス內で使用する場(chǎng)合は退格を表します。 |
\t | タブ |
\r | Enter(エンターキー) |
\v | 縦向タブ |
\f | ページ送り |
\n | 改行符:改行(がいよう、LF) |
\e | Escape |
\0nn | ASCIIコードで八進(jìn)數表記がnnの文字 |
\xnn | ASCIIコードで16進(jìn)數がnnの文字 |
\unnnn | Unicodeコードの16進(jìn)數はnnnnの文字 |
\cN | ASCII制御文字。例えば\cCはCtrl+Cを意味します。 |
\A | 文字の先頭に(^のように見(jiàn)えるが、複數行オプションに影響されない) |
\Z | 文字の末尾または行の終わり(複數行の処理オプションに影響されない) |
\z | 文字列の終わり($に似ているが、複數行のオプションに影響されない) |
\G | 現在の検索の先頭 |
\p{name} | Unicodeに名前がnameのキャラクターグループ、例えば\p{IsGreek} |
(?>exp) | 肥甘の子表現 |
(? < x> - < y>exp) | バランスグループ |
(?im-nsx:exp) | 子表現式expで処理オプションを変更します。 |
(?im-nsx) | 表現式の後ろの部分で処理オプションを変更します。 |
(?(exp)yes|no) | expを零幅正先行斷言として扱い、この位置で一致する場(chǎng)合「はい」をこのグループの表現として使用し、一致しない場(chǎng)合「いいえ」を使用します。 |
(?(exp)yes) | 同じですが、空の表現を使って「no」とします |
(?(name)yes|no) | nameグループが內容をキャプチャした場(chǎng)合、yesを使用;キャプチャしなかった場(chǎng)合、noを使用 |
(?(name)yes) | 同じですが、空の表現を使って「no」とします |
好吧,我承認,我騙了你,讀到這里你肯定花了不止30分鐘.相信我,這是我的錯,而不是因為你太笨.我之所以說(shuō)"30分鐘",是為了讓你有信心,有耐心繼續下去.既然你看到了這里,那證明我的陰謀成功了.被忽悠的感覺(jué)很爽吧?
苦情を申し立てるか、もっと上手く騙せると思われるか、他の何かありましたら、どうぞお気軽にお知らせください。 私のブログ 知らせてください。
最近使用した: