30分で正規表現が何かを理解し、基本的な使い方が分かるようにします。自分のプログラムやウェブページで使えるようになります。
正則表現30分間の入門講座 本文の目的 このチュートリアルを使う方法 正規表現とは何か? 初心者 正則表現式をテストします。 メタシンボル 文字エスケープ 繰り返す 文字種類 分岐条件 グループ分け 反対(はんたい) 後向参照 零広断言(りょうきょうだんげん) 負向零幅広断言(ふぞうれいぞくかくだんせい) 注釈 貪欲と怠惰 選択肢を処理します。 バランスグループ/再帰マッチング 何か言及されていないことがありますか? 著者に連絡してください。 オンラインのリソースおよび本文の参考文献
下記の複雑な表現に恐れをなさる必要はありません。私のステップに従えば、正規表現が想像以上に難しくないことに気づくでしょう。もちろん、このチュートリアルを読み終わった後、多くを理解したことに気づいてもほとんど何も思い出せないこともあるでしょう——私は考えますが、正規表現に初めて触れる人にとって、この
最も大切なのは——お願いします 30分 もし正規表現の経験がなければ、30分以内に試みないでください。 秒:秒(びょう) 内門 - 除非君がスーパーマンです :P
この記事は、初心者向けのチュートリアルだけでなく、日常業務で使える正則表現の文法リファレンスを目指しています。著者の経験から言えば、この目標は達成されています。自分自身も全てを覚えることはできていないでしょう。
フォーマットをクリアしてください。 テキストフォーマットの約定: 専門用語 メタキャラクター/文法フォーマット 正規表現 正規表現式の一部(分析用) マッチングする元文字列 正則表現式またはその一部の説明 。
注釈を隠す 本文右にいくつかの注釈があります。主に関連情報を提供したり、プログラマーの背景がない読者に基本的な概念を説明するために用いられています。通常は省略できます。
プログラムやウェブページで文字列を扱う際、特定の複雑なルールに合致する文字列を検索することがよくあります。 正規表現 これらのルールを記述するツールです。別の言い方をすると、正規表現はテキストのルールを記録するコードです。
Windows/Dosでファイル検索に使ったものかも。
ワイルドカード(通配符)
wildcard
)
つまり、
*
「わ」
?
特定のディレクトリ内のすべてのWordドキュメントを探す場合、以下のように検索します:特定のディレクトリ内のすべてのWordドキュメントを検索します。
*
.doc
ここに、
*
任意の文字列として解釈されます。ワイルドカードと同様に、正規表現もテキストのマッチングに使われるツールですが、ワイルドカードより詳細な条件を指定できます。ただし、複雑さが増します。例えば、特定のパターンを探すための正規表現を書くことができます。
すべて0で始まり、その後2~3桁の数字が続き、ハイフン「-」があり、最後に7または8桁の数字が続く文字列
像: 似に
010-12345678
「または」
0376-7654321
)。
文字 文字処理の基本単位で、文字、数字、記号、スペース、改行、漢字などが含まれる。 文字列 0文字以上のシーケンスです。 テキスト 文字、文字列とも呼ばれる。ある文字列について語る。 一致です 正規表現は、文字列の中で特定の部分(または複数の部分)が条件を満たすことを示す表达式です。
正規表現を学ぶ最良の方法は、例から始め、例を理解して自分で修正し、実験することです。以下に多くの簡単な例が示され、詳細に説明されています。
仮にあなたが英文の小説の中で探していると仮定します。 hi 正規表現を使用できます。 hi 。
これはほぼ最も簡単な正規表現で、以下のような文字列を正確に一致させます: 二文字で、最初は「h」、二つ目は「i」 通常、正規表現を処理するツールは大文字小文字を区別しないオプションを提供します。これを選択すると、それが一致させることができます。 hi , HI , Hi , hI どれでも可。
残念ながら、多くの単語には含まれています。 hi この連続した記号、例えば him , history , high ちょっと待って。 hi 探すと、ここには hi 見つかることもあります。もし… 正確に「hi」という単語を探してください。 それでは、~を使用するべきです。 \bhi\b 。
\b
正規表現で定義された特別なコードです(いいえ、誰かが呼んでるんですけど)
メタキャラクター
metacharacter
)、代表しています。
単語の先頭または末尾、つまり単語の分かれ目です。
しかし、通常英語の単語はスペース、記号、または改行で区切られているが、
\b
これらの単語分離文字のいずれにも一致しません。
一箇所だけ一致させる
。
仮にあなたが探しているのは こんにちは、そのすぐ後ろにはLucyがいます あなたは使うべきです \bhi\b.*\bLucy\b 。
より正確な表現が必要です。 \b その位置は、その前の文字と後の文字がどちらも(いずれも)一致しない場合です:あるのは、あるのはない場合も含みます。 \w 。
ここでは、.は別のメタキャラクターであり、一致させる。 任意の文字(改行符以外) 同じく、マッチキャラクターですが、文字や位置ではなく、数量を指定しています。 * 前の内容を何度も繰り返して、全体の表現が一致するようにできます。 それゆえ、. * 連結することで、改行を含まない任意数の文字が結びつくことになります。 今(いま) \bhi\b. * \bLucy\b その意味は明らかです: ハイ 任意文字列(改行不可)Lucy 。
他のメタキャラクタを同時に使用することで、より強力な正規表現を構築できます。例えば以下の通りです:
0\d\d-\d\d\d\d\d\d\d\d このような文字列を一致させる: 0で始まり、2桁、ハイフン、8桁 それ即ち中国の電話番号です。もちろん、この例は3桁の地域コードにのみ一致します。
换行符就是'\n',ASCII编码为10(十六进制
0x0A
)の文字。
ここに \d 新しいメタキャラクタ、一致します 一つの数値(0、または1、または2、または……) )。- 元文字列ではありません。そのままのハイフン(またはマイナス、または短縮線など、どのように呼んでもかまいません)。
多くの煩わしい重複を避けるために、この表現をこんなように書くこともできます: 0\d{2}-\d{8} ここに \d 後ろの{ 2 }({ 8 })の意味は、前の文のことです。 \d 連続して2回(8回)一致させる必要があります 。
正則表現式が読み書きが難しくないと感じないなら、天才か地球外の人間でしょう。文法が厄介で、使い慣れても難しいです。読み書きが難しくて間違えやすいので、テストツールを使うのは重要です。
他のテストツール:
異なる環境では正規表現の詳細が異なります。このチュートリアルでは、マイクロソフト .Net Framework 4.0における正規表現の動作を紹介していますので、.Net向けのツールを私が作成したことをお勧めします。 正規表現テストツール このページの説明に従ってソフトウェアをインストールおよび実行してください。
以下は、Regex Testerの実行時のスクリーンショットです:
今あなたはいくつかの非常に役立つメタキャラクターを知っています、たとえば \b , . , * , そして \d 正規表現にはさらに多くのメタキャラクターがあります、例えば \s 一致です 任意の空白文字、空格、タブ、改行文字、全角スペース等を含む 。 \w 一致です アルファベットまたは数字または下線または漢字など 。
以下、より多くの例を見てみましょう:
\ba\w * \b 一致させるためのアルファベット a 単語の先頭部分ーーある単語が始まる場所 \b ),その後はアルファベットです a それから、任意の数の文字または数字( \w * ),最後に単語の終わり( \b )。
.Netの正則表現エンジンが漢字/中国語の特別な処理をサポートしています。他の環境における詳細は、関連文書を参照してください。
了解しましたね、正規表現の単語について話しましょう:少なくとも1つの連続する\wです。いいですね、これは英文を学ぶときに覚える何千もの同じ名前のものとはあまり関係がありませんよ :)
\d+ 一致です 1つまたは複数の連続数字 ここに + はと * 似たようなメタチャラクター、ただし異なるのは * 任意回数(0回も可)で一致 + 則一致(そくてき) 繰り返し1回以上 。
\b\w{6}\b 一致です 正に6文字の単語 。
コード | 説明 |
---|---|
. | 任意文字を一致させる(改行符を除く) |
\w | アルファベットまたは数字またはアンダースコアまたは漢字と一致 |
\s | 任意の空白文字に一致します |
\d | 数字一致に合わせる |
\b | 単語の開始または終了に一致 |
^ | 文字の一致部分の先頭を照合する |
$ | 文字列の終了が一致します |
メタシンボル ^ (数字6と同じキーに配置されている記号)と $ すべての位置に一致、これは \b 少し似ている。 ^ 検索する文字列の先頭に一致するように設定してください。 $ このコードは、入力内容の検証に非常に役立ちます。たとえば、ウェブサイトでQQ号码が5桁から12桁の数字で入力する必要がある場合、以下のように使用できます: ^\d{5,12}$ 。
ここに{ 5,12 } そして、前に紹介された{ 2 同じように、ただし{ 2 マッチング しかしながら、2回だけ繰り返します ,{ 5,12 それでは 繰り返し回数は5回未満でないこと、12回を超えないこと それとも一致しません。
正規表現エンジンは、JavaScriptのように「指定された文字列が正規表現に一致するかどうかをテストする」メソッドを提供します。
RegExp.test()
方法や.NETのRegex.IsMatch()メソッド。ここでの「マッチ」は、文字列に表記された規則に一致する部分があるかどうかを指します。使わない場合 ^ 「わ」 $ のこと、について \d{5,12} その方法を使うと、文字列に含まれることが保証されます。 5から12までの連続する数字 それが5から12桁の数字だけではなく、整个字符串です。
因使用して ^ 「わ」 $ したがって、入力された整个文字列を使って \d{5,12} 来匹配、すなわち全ての入力が 5~12の数字 それゆえ、入力されたQQ号码がこの正規表現に一致すれば、要件を満たします。
大文字小文字を区別しないオプションと同様に、一部の正規表現処理ツールには、複数行を処理するオプションがあります。このオプションが有効になると、 ^ 「わ」 $ 意味は変わることになります 行の始端と終端の一致 。
元文字自身を探そうとすると、.や*のような場合、問題が発生します:それらを指定することができません。なぜなら、それらは別の意味と解釈されるからです。そのためには、\を使ってその文字の特殊な意味を解除する必要があります。したがって、あなたは使うべきです: . 「わ」 \ * もちろん、「\」そのものを見つけるには、\を使う必要があります。 \ \ .
例えば:
unibetter
\
.com
一致です
unibetter.com
,
>C:
\
Windows
一致です
C:\Windows
。
前を見てきました * , + , {2} , {2,5} これらの一致方法は重複しています。以下は、正規表現中のすべての限定子(例えば、*, {5,12}などの指定数量のコード)です:
コード/文法 | 説明 |
---|---|
* | 何もしない場合も可 |
+ | 繰り返し1回以上 |
? | 零回または一度 |
{n} | n回繰り返す |
{n,} | 繰り返しn回以上 |
{m,m} | nからmまで繰り返します |
以下は、繰り返しの例です:
Windows\d+ 一致です Windows後に1個以上の数字が続く。
^\w+ 一致です 一行的最初の単語(または全体の最初の単語、どちらをマッチさせるかはオプションの設定による)
数字やアルファベット、スペースを検索するのは簡単です。それらの文字に対応していますから。 * * のメタ文字、しかしプレデファインドメタ文字を持たない文字を一致させる場合は * * (たとえば、母音文字a、e、i、o、u)、どうすればよいですか?
単純です。方括号に入力すれば、そのままになります。 [aeiou] 一致です どの英語の母音文字も , [.?!] 一致です ...?.! 。
指定するのも簡単です 範囲 ,まるで [0-9] 代表の意味と \d 全く一致です: 一位数数字 同様に [a-z0-9A-Z_] 全く同じです \w (英語だけで考えれば)。
以下はより複雑な表現です: \ (?0\d{2}[) -]?\d{8} 。
この表現は一致させることができます 複数のフォーマットの電話番号 ,まるで (010)88886666 、または 022-22334455 、または 02912345678 待ちましょう。それについて少し分析してみましょう:まずはエスケープシーケンスから始めましょう。 \ (, 0回もしくは1回でもよい。 ? ),その後は、 0 、後ろに2つの数字が続きます。 \d{2} ),それから)または-または スペース その中で、1回出現または出現しない ? ),最後に8桁の数字( \d{8} )。
「(」および「)」もメタキャラクターであり、後ろの 分群祭(ぶんぐんさい) ここでは触れられるため、ここでは使用する必要があります。 エスケープ 。
残念ながら、その表現も一致しました。 010)12345678 「または」 (022-87654321 この「不正確」なフォーマットを解決するには、以下の方法が必要です。 分岐条件 正規表現の中で 分岐条件 ある種のルールが複数あって、そのうちのいずれかを満たせばマッチとする。ルールは「|」で区切る。理解できなかった?大丈夫、例を見てみよう:
0\d{2}-\d{8}|0\d{3}-\d{7} この表現は 電話番号を以下の形式で一致させる:③桁の地域コード+⑧桁のローカルコード(例:010-12345678)、または④桁の地域コード+⑦桁のローカルコード(例:0376-2233445) 。
\ (0\d{2} ) [- ]?\d{8}|0\d{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}
一致です
三位数+英文句点(その全体はこれです)
グループ分け
繰り返します。
最後に、それに加えて
1〜3桁の数字
\
d{1,3}
)
。
不運的是、それも一致します
256.300.888.999
存在しないIPアドレスです。算術的な比較ができるなら、問題を簡単に解決できるかもしれませんが、正規表現には数学的な機能が提供されていないので、長いグループ、選択、文字クラスを使用して正しいパターンを記述するしかありません。
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? ここでは詳しく説明は省きます。あなたは意味を理解できるでしょう。
ある時は、簡単に定義できる文字クラスに属さない文字を検索する必要があります。例えば、数字以外の全ての文字を検索したい場合、以下の方法を使います。 反対(はんたい) :
コード/文法 | 説明 |
---|---|
\W | 任意のアルファベット、数字、アンダースコア、漢字でない文字を一致させます |
\S | 任意非空白文字の一致 |
\D | 任意非数字文字の一致 |
\B | 一致しない単語の先頭や末尾の位置 |
[^x] | 任意文字以外の一致 |
[^aeiou] | あいおう以外の文字を一致させる |
例: \S+ 空白符なしの文字列を一致させます。
<a[^> ] +> 尖括号で括まったaで始まる文字列を一致させる。
小括号で指定された子式が、 該子表現式と一致するテキスト (このグループが捉えた内容も)表現や他のプログラムでさらなる処理ができます。デフォルトでは、各グループには自動的に一つの グループNo. ルールは:左から右に並べ、左括弧でグループを示し、最初に現れるグループの番号は1、次は2と順に増やします。
後向参照 前に一致したグループのテキストを繰り返し検索する。例えば、 \1 代表:代表者(だいひょうしゃ) グループ1でマッチしたテキスト 理解に難しいですか?例を見てください。
\b(\w+)\b\s+\1\b 重複の単語を一致させるために使える、みたいです go go 、または kitty kitty この表現はまず、 一つの単語 つまり、 単語の先頭と末尾の間に2つ以上のアルファベットまたは数字が含まれる (\b(\w+)\b) その単語は、その後1番のグループに分類されます。 1個または複数の空白シンボル ( \s+ ),最後に、 グループ1で捕獲された内容(つまり先ほど一致した単語) \1 ) 。
実は、グループの割り当ては私が言ったほど単純ではありません:
- グループ0は全体の正規表現に対応します。
- 実際にはグループ番号の割り当てプロセスは左から右に2回スキャンします:まず1回目で名前がついていないグループに割り当て、2回目で名前がついているグループに割り当てます。したがって、すべての名前がついているグループの番号は名前がついていないグループの番号よりも大きいです。
- (?:exp)のような文法を使って、一つのグループがグループ番号の割り当てに参加する権利を剥奪できます。
子表現式を自分で指定することもできます。 グループ名 子表現式グループ名を指定する場合は、以下の構文を使用してください: ? < Word>\w+ )(或者把尖括号换成'也行:( ?'Word'\w+ ),これで \w+ のグループ名を指定します。 Word 分組を逆参照します。 捕まえる の内容、あなたは使用できます \k < Word> したがって、前の例はこんな風にも書ける: \b(? < Word>\w+)\b\s+\k < Word>\b 。
小括号の使い方には、多くの特定の文法がある。以下に最もよく使われるものを挙げる。
xxxxxxxxxx
分类 代码/语法 説明
-----------------------------------------------------------------------------------------
(exp) 匹配exp,并捕获文本到自动命名的组里
捕获 (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
-----------------------------------------------------------------------------------------
(?=exp) 匹配exp前面的位置
零広断言(りょうきょうだんげん) (?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
-----------------------------------------------------------------------------------------
注釈 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释
すでに前两种文法について議論しました。第3の( ?:exp 正規表現式の処理方法を変えません。ただし、このようなグループは前の2つのグループのようにキャプチャされず、グループ番号もありません。“なぜそのようにしたいのか?”——素晴らしい質問です、どう思いますか?
次の四つの単語は、特定の内容(それらの内容を含まない)の前後にあるものを探すために使われます。つまり、それらは似ていますね。 \b , ^ , $ そのように位置を指定し、その位置が特定の条件(つまり断言)を満たすべきであるため、それらはまた...と呼ばれます 零広断言(りょうきょうだんげん) 例を示すのが一番わかりやすいでしょう:
(?=exp)
もしくは
零幅広正予測先行断言
、それ
自身の位置の後でexpと一致する文を主張
例えば
\b\w+(?=ing\b)
,一致に
ing
结尾の単語の前半部分(除く)
ing
以降(いこう))
,如検索
I'm
singing while you're
dancing.
その時、それが一致します
sing
「わ」
danc
。
(?<=exp)
もしくは
零幅広正逆後発断言
、それ
自身の位置が表す前の部分が表現expに一致することを断言します
たとえば(
?<=\bre)\w+\b
一致するべき
「re+」で始まる単語の後半部分(「re」以外の部分)
例えば、検索する際に
reading
a book
その時、一致します
ading
。
地球人、これらの専門用語が複雑で覚えにくいと思いませんか?私も同じ感じです。その存在を知っていれば良い、名前はどうでもいいです。人間に名前がなければ剣の修行に集中できます;物に名前がなければ自由に選べます……
断言は真であるべき事実を宣言する。正規表現では、断言が真でないと続行しません。
もし、非常に長い数字に3桁ごとにカンマを入れる場合、以下のようにカンマを入れるべき場所を探すことができます: ((?<=\d)\d{3})+\b それを使って 1234567890 検索結果は 234567890 。
この例では、この二つの断言が同時に使用されています。 (?<=\s)\d+(?=\s) 一致です 空白記号で区切られた数字(再確認しますが、これらの空白記号は含まないでください) 。
前にお話しした通り、どう探すか 特定の文字または文字クラスに属していない 文字の方法(反対)。しかし、もし私たちは単に 特定の文字が含まれないことを確認するが、その文字をマッチングするつもりはない どうすればいいですか?例えば、このような単語を探したいときは、例えば、qの後にuが続かない単語を探す場合は、こんな方法を試してみましょう:
\b\w * q [ ^u ] \w * \b 一致です 含む(ふくむ) ク以外のアルファベットのキュー の単語 .しかし、もっとテストをしたり(またはあなたの思考が鋭ければ、直接観察でわかるかもしれないが)、qが単語の末尾に現れると、像 Iraq , Benq この表現がエラーになるのは、そのためです。 [^u] 總は一文字は一致させる必要があるため、qが単語の最後の文字であれば、後ろに [ ^u] qの後の単語区切り(スペース、ピリオドなどが考えられる)を一致させる予定です \w * \b 次の単語を一致させるため、です。 \b\w * q [ ^u]\w * \b 全体を一致させることができる Iraq fighting 。 負向零幅広断言(ふぞうれいぞくかくだんせい) この問題を解決できるのは、その位置を1つだけマッチングするからです。 消費 どんな文字でも。今やこの問題をこのように解決できます: \b\w * q(?!u)\w * \b 。
零幅広負予測先行断言
(?!exp)
,
この位置の後でexpression expはマッチしませんと断言します
例えば:
\d{3}(?!\d)
三桁の数字が一致です。それで
三桁の数字の後ろは数字ではありません
;
\b((?!abc)\w)+\b
一致です
連続した文字を含まない
abc
の単語
。
同様に、私たちは使えます (?<!exp) , 零幅広負後回帰断言 来ます。 この位置の前にexpression expはマッチしませんと断言します : (?<![a-z])\d{7} 一致です 前頭の7桁の数字は小文字ではありません 。
一例も複雑なもの: (?<=<(\w+)>). * (?=<\/\1>) 属性なしの簡単なHTMLタグ内の内容をマッチング 。 (?<=<(\w+)>) 指定したような 接頭辞 : <角括号>括った単語 たとえば、それはかもしれない。 < b>),然后是 .* (任意の文字列),最後に一つがつきます 接尾辞 (?=<\/\1>) 注意接尾語に. \/ 前述のキャラクターエスケープを使用しています。 \1 それは逆引用で、引用されているのは 初めに捕まえたもの ,前にの (\w+) マッチングされた内容、もし接頭辞が実際には < b>的话,后缀就是 < /b>了。整个表达式匹配的是 < b>和 < /b>之间的内容(再次提醒,不包括前缀和后缀本身)。
表达式を詳細に分析してください。 (?<=<(\w+)>). * (?=<\/\1>) この表現が零幅断言の真の用途を最もよく表している。
小括号の別の用途は、文法を通じてです。 (?#comment) 来含めます。 2[0-4]\d(?#200-249)|25 [ 0-5](?#250-255)|[01]?\d\d?(?#0-199) 。
コメントを含める場合、「スペース文字を無視するモード」のオプションを有効にすると良いでしょう。これにより、式を記述する際に自由にスペース、タブ、改行を追加できますが、実際の使用ではこれらは無視されます。このオプションを有効にすると、#以降の行末までのすべてのテキストがコメントとして無視されます。例えば、以下のように
(?<= | # テキストの前缀と一致する断言を行う |
<(\w+)> | # <角括号で囲まれた文字または数字(HTML/XMLタグ)を検索する |
) | 接続子終了 |
.* | 任意テキストにマッチ |
(?= | # テキストの接尾辞を一致させる断言 |
<\/\1> | # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签 |
) | # エンディングシーケンス |
正規表現式中、繰り返し限定子が含まれる場合、通常の行動は(全体の表現式が一致する前提で)一致させることです。
できるだけ多く
の文字。この表現を例にして:
a.
*
b
それが一致させるでしょう
最長でaで始まりbで終わる文字列
それを使って検索する場合
aabab
それで、全体の文字列が一致します。
aabab
これは「~と呼ばれる」と言います。
貪欲
マッチ。
時に、私たちはもっと必要とします 怠けたくなる マッチング、つまりマッチング できるだけ少なく の文字。先に示された限定子は、その後ろに疑問符を加えることで、遅い一致モードに変換できます。 ? これはですね。 .*? それゆえに 任意数の重複をマッチするが、全体のマッチを成功させるために最小の重複を使用します 今、怠け者の例を見てみましょう:
a.
*
?b
一致です
最短で、aで始まり、bで終わる文字列
それを適用すると、
aabab
のなら、一致します
aab
(第一から第三文字)
「わ」
AB(第4~5文字)
。
コード/文法 | 説明 |
---|---|
*? | 何度でも繰り返せるが、できるだけ少なく |
+? | 繰り返し1回以上、できるだけ少なく |
?? | 0回または1回、できるだけ少なく重複 |
{n,m}? | nからmまで繰り返すが、できるだけ少なく |
{n,}? | 「n回以上繰り返し、できるだけ少なく」 |
なぜ最初の一致はaab(最初から3番目の文字)であって、ab(2番目から3番目の文字)ではないのか?簡単に言うと、正規表現には他のルールがあり、懒惰/贪婪ルールよりも優先度が高い:最初に始まる一致が最も高い優先権を持っているからだ - The match that begins earliest wins。
上記でいくつかのオプション、例えば大文字小文字を区別しない、複数行を処理するなどが紹介されました。これらのオプションは正規表現の処理方法を変更するために使えます。以下は.NETでよく使われる正規表現オプションです:
名称:名称(めいしょう) | 説明 |
---|---|
IgnoreCase
無視します。
|
大文字小文字を区別しないマッチング |
Multiline
マルチラインモード
|
変更 ^ 「わ」 $ の意味で、任意の行の先頭と末尾に一致させる。単に全文の先頭と末尾に一致させるのではなく、(このモードでは、) $ の正確な意味は:マッチする位置と文字列の終わりまでの位置です。 |
Singleline
(単一行モード)
|
文字列の意味を変更し、全ての文字(改行符\nも含む)に一致させる。 |
IgnorePatternWhitespace
(空白を省略)
|
非変換スペースを無視して、有効にします。 # マークのコメント |
ExplicitCapture
(明示キャッチ)
|
明示的に名前付けられたグループのみキャッチ |
よく質問されるのは、多行モードと単行モードは同時に使えるのかです。答えは、違います。これらのオプションは名前が似ているだけで(混乱させるためか)、他には何の関係もありません。
C#で使えるのは Regex(String, RegexOptions)コンストラクタ 来设置正则表达式的处理选项。如:Regex regex = new Regex(@"\ba\w{6}\b", RegexOptions.IgnoreCase);
時には、像のように一致させる必要があります。 ( 100 * ( 50 + 15 ) ) そのような入れ子になった階層構造は、単純に使用 \ (.+ \ ) 左側の左括号と右側の右括号の間の内容だけが一致します(ここでは、強制一致モードについて説明していますが、遅延一致モードでも同様の問題があります)。元の文字列の左括号と右括号の数が一致しない場合、例えば ( 5 / ( 3 + 2 ) ) ) それでは、両者の数は等しくないでしょう。そのような文字列の中で最も長い括弧内の内容をどうやってマッチングできるのでしょうか?
ここで紹介されるバランス構文は.Net Frameworkでサポートされています;他の言語/ライブラリではこの機能がサポートされていないか、またはサポートされている場合でも異なる構文が必要です。
避けます ( 「わ」 \ ( 脳を完全に混乱させましょう。今や問題は、角括号で丸括号を置き換える方法についてです。 xx aa> yy その文字列の中で最も長い括弧内の内容を取得する?
ここでは以下の文法構造が必要です。
(?'group') 捕獲した内容を「group」と名付け、プッシュしてください。 スタック(Stack)
(?'-group') スタックから最後にpushされた名前がgroupのキャプチャ内容をpopし、スタックが既に空であれば、このグループのマッチングが失敗します。
(?(group)yes|no) グループのキャプチャがスタックにある場合、yes部分の表达式に続いてマッチングします。そうでない場合は、no部分に続いてマッチングします。
(?!) 零幅否定先行断言、後続表現式なし、常に失敗します
我们需要做的是每碰到了左括号,就在压入一个"Open",每碰到一个右括号,就弹出一个,到了最后就看看堆栈是否为空--如果不为空那就证明左括号比右括号多,那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符),尽量使整个表达式得到匹配。
如果你不是一个程序员(或者你自称程序员但是不知道堆栈是什么东西),你就这样理解上面的三种语法吧:第一个就是在黑板上写一个"group",第二个就是从黑板上擦掉一个"group",第三个就是看黑板上写的还有没有"group",如果有就继续匹配yes部分,否则就匹配no部分。
xxxxxxxxxx
< 最外層の左括弧
[^<>]* 最外層の左括号の後ろに括号のない内容があります。
(
(
(?'Open'<) 左括号に遭遇したら、黒板に「Open」を書く。
[^<>]* 左括号の後ろに括号でない内容をマッチする
)+
(
(?'-Open'>) 右括号に当たったら「オープン」を一つ消す
[^<>]* # 括号の後ろに括号でない内容をマッチする
)+
)*
(?(Open)(?!)) 最外層の右括弧の前に「Open」が黑板に残っていないか確認;あれば、マッチング失敗
> 最外層の右括弧
バランスグループの最も一般的な応用例はHTMLのマッチングです。以下の例では、ネストされたものをマッチングできます。 < div>标签: <div [ ^>] * > [ ^<>]*(((?'Open'] * >) [ ^<>] * )+((?'-Open') [ ^<>] * )+) * (?(Open)(?!)) < /div>
上記で正規表現の構築に必要な多くの要素が記述されていますが、言及されていないものも多数あります。以下に、その中の一部を含む要素のリストとその文法および簡単な説明を挙げます。詳細な情報を学ぶためには、オンラインでより詳しいリソースを探してください-必要に応じて。MSDN Libraryをインストールしていても、.NETの
コード/文法 | 説明 |
---|---|
\a | 警報文字(コンピュータが「ディー」と鳴る効果) |
\b | 通常は単語の区切り位置ですが、文字クラス内で使用する場合は退格を表します。 |
\t | タブ |
\r | Enter(エンターキー) |
\v | 縦向タブ |
\f | ページ送り |
\n | 改行符:改行(がいよう、LF) |
\e | Escape |
\0nn | ASCIIコードで八進数表記がnnの文字 |
\xnn | ASCIIコードで16進数がnnの文字 |
\unnnn | Unicodeコードの16進数はnnnnの文字 |
\cN | ASCII制御文字。例えば\cCはCtrl+Cを意味します。 |
\A | 文字の先頭に(^のように見えるが、複数行オプションに影響されない) |
\Z | 文字の末尾または行の終わり(複数行の処理オプションに影響されない) |
\z | 文字列の終わり($に似ているが、複数行のオプションに影響されない) |
\G | 現在の検索の先頭 |
\p{name} | Unicodeに名前がnameのキャラクターグループ、例えば\p{IsGreek} |
(?>exp) | 肥甘の子表現 |
(? < x> - < y>exp) | バランスグループ |
(?im-nsx:exp) | 子表現式expで処理オプションを変更します。 |
(?im-nsx) | 表現式の後ろの部分で処理オプションを変更します。 |
(?(exp)yes|no) | expを零幅正先行断言として扱い、この位置で一致する場合「はい」をこのグループの表現として使用し、一致しない場合「いいえ」を使用します。 |
(?(exp)yes) | 同じですが、空の表現を使って「no」とします |
(?(name)yes|no) | nameグループが内容をキャプチャした場合、yesを使用;キャプチャしなかった場合、noを使用 |
(?(name)yes) | 同じですが、空の表現を使って「no」とします |
好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?
苦情を申し立てるか、もっと上手く騙せると思われるか、他の何かありましたら、どうぞお気軽にお知らせください。 私のブログ 知らせてください。
最近使用した: