定期的
メタキャラクター
メタキャラクター:.^$+?{}[]|()\
. 通配符(除\n的任何字符)
\d 数字
\s 空白字符
\w 字母或数字或下划线或汉字
\b 特殊字符边界(匹配单词边界,不匹配任何字符。要防止转义字符串前面加r)
^ 开始
$ 结束
キャラクターエスケープ
\一致するメタ文字に一致するエスケープに使用\使用する必要がある\
キャラクタークラス
文字範囲
[] 从字符集里匹配一个 可以使用a-z a,z表示范围 [.?!] 匹配标点符号(.或?或!)
例:
[\u4E00-\u9FA5] 匹配汉字
重複する一致
* 0~无穷(可以按照0*True,结果为0)尽可能多的匹配
+ 1~无穷(可以按照0+True,结果为True)
? 出现0~1次(取最少)非贪婪匹配
{n,m} n-m次
{n,} 多于n次
{0,}==* {0,1}==? {1,}==+
例:
携帯電話番号の正規化:
^1[3|5|8]\d{9}$
貪欲と怠惰
正規表現に繰り返しを受け入れることができる修飾子が含まれている場合、通常の動作は(式全体が一致することを前提として)、できるだけ多くの文字に一致することです。この式を例にとると、a。* B、aで始まりbで終わる最も長い文字列に一致します。これを使用してaababを検索すると、文字列aabab全体と一致します。これは貪欲マッチングと呼ばれます。
場合によっては、遅延マッチング、つまり可能な限り少ない文字とのマッチングが必要になります。上記の修飾子は、疑問符が続く限り、遅延一致モードに変換できますか?これ.*?
は、任意の数の繰り返しに一致することを意味しますが、全体の一致を成功させるという前提の下で、最小の繰り返しを使用します。次に、遅延バージョンの例を見てみましょう。A* bは、aで始まりbで終わる最も短い文字列に一致します。これをababに適用すると、aab(最初から3番目の文字)およびab(4番目から5番目の文字)に一致します。
最初の一致がb(2番目から3番目の文字)ではなくaab(最初から3番目の文字)であるのはなぜですか?簡単に言うと、正規表現には別のルールがあるため、遅延/貪欲ルールよりも優先度が高くなります。最初に始まる一致が最も優先度が高く、最初に一致するものが優先されます。
デフォルトの貪欲マッチング(後ろから前へのマッチング)
貪欲でない(前から後ろへ)貪欲の後に追加されましたか?
|分岐条件(または一致)
\d{5}-\d{4}|\d{5}
この式は、米国の郵便番号を照合するために使用されます。米国の郵便番号規則は5桁、またはハイフンで区切られた9桁です。この例が示されている理由は、問題を説明できるためです。分岐条件を使用する場合は、各条件の順序に注意してください。に変更すると\d{5}|\d{5}-\d{4}
、郵便番号(および9つの郵便番号の最初の5つ)のみに一致します。その理由は、分岐条件に一致すると、各条件が左から右にテストされ、特定の分岐が満たされた場合、他の条件は処理されないためです。
()グループ
(\d{1,3}.){3}\d{1,3}
単純なアドレス照合式です。この表現を理解するには、次の順序で分析してください:\d{1,3}
1から3桁に(\d{1,3}.){3}
一致し、3桁に加えて英語のピリオドに一致し、全体がグループです)3回繰り返し、最後に1から3桁を追加します数(\d{1,3})
括弧を使用して副次式を指定した後、副次式に一致するテキスト(つまり、このグループによってキャプチャされたコンテンツ)を式または他のプログラムでさらに処理できます。デフォルトでは、各グループには自動的にグループ番号が付けられます。ルールは、左から右へ、グループの左括弧を記号として、最初のグループのグループ番号は1、2番目のグループは2として表示されます。類推によって。
残念ながら、これは256 | 300888999の不可能な| Pアドレスにも一致します。算術比較を使用できる場合は、この問題を簡単に解決できる可能性がありますが、正規表現は数学に関する関数を提供しないため、正しいグループ化、選択、および文字クラスのみを使用して正しい| Pアドレスを記述できます。(2[0-4]\d|25[0-5]|[01]?\d\d?\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
var s='JavaScript and Java'
var p=/\bJava(\w+)\b/
p.exec(s)[0] //结果为:"JavaScript"
p.exec(s)[1] //结果为:"Script"
アンチセンス
単純に定義できる文字クラスに属していない文字を見つける必要がある場合があります。たとえば、数字以外の文字を検索する場合は、アンチセンスを使用する必要があります。
一般的なアンチセンスコード:
コード/構文 | 解説 |
---|---|
\ W | 英数字以外の下線付き漢字 |
\ S | 空白以外の文字 |
\ D | 数字以外の文字 |
\ B | 単語以外の開始または終了 |
[^ x] | x以外の文字 |
[^ aeiou] | 愛桜以外のキャラクター |
例:
\S+ 匹配不包含空白字符的字符串
<a[^>]+> 匹配尖括号包起来的a开头的字符串
取得しない一致:
\w(?=pattern) 正向肯定匹配
(?<=pattern)\w 逆向肯定匹配
\w(?!pattern) 正向否定匹配
(?!pattern)\w 反向否定匹配
後方参照
\b(\w+)\b\s+\1\b
\ 1は、最初のグループのコンテンツを使用して、隣接する単語の繰り返しを照合することを示します。
部分式のグループ名を自分で指定することもできます。部分式のグループ名を指定するには、次の構文を使用します。(?<Word>\w+)
山かっこを ':(?' Word '\ w +)に置き換えて、\ w +のグループ名がWordとして指定されるようにします。この参照パケットキャプチャを逆にするには、あなたが使用することができ\k<Word>
、前の例もこのように書き込むことができますので、: (?<Word>\w+)\b\s+\k<Word>\b
。
実用的な括弧の使い方はまだたくさんありますが、よく使われる括弧を挙げてください:
分類 | コード/構文 | 解説 |
---|---|---|
捕獲 | (exp) |
expを一致させ、テキストを自動的に名前が付けられたグループにキャプチャする |
捕獲 | (?<name>exp) |
expに一致し、nameという名前のグループにテキストをキャプチャします。次のように記述することもできます。(?'name'exp) |
捕獲 | (?:exp) |
expに一致、テキストをキャプチャしない、グループを割り当てない |
ゼロ幅アサーション | (?=exp) |
expの前の位置に一致 |
ゼロ幅アサーション | (?<=exp) |
expの後の位置に一致 |
ゼロ幅アサーション | (?!exp) |
expが後に続かない位置に一致 |
ゼロ幅アサーション | (?<!exp) |
expの前ではない位置に一致 |
コメント | (?#comment) |
このグループ化は、正規表現に影響を与えず、人間が読むためのコメントを提供します |
ゼロ幅アサーション
次の4つは、特定のコンテンツの前後にあるものを検索するために使用されます(ただし、それらを含みません)。つまり、b、^、$などの位置を指定するために使用され、この位置は特定の条件を満たす必要がありますつまり、アサーション)であるため、ゼロ幅アサーションとも呼ばれます。例でそれを説明するのが最善です:
アサーションは、真であるべき事実を宣言するために使用されます。正規表現は、アサーションがtrueの場合にのみ一致し続けます。
(?=exp)
ゼロ幅ポジティブ予測優先アサーションとも呼ばれ、出現位置が式expと一致する可能性があることをアサートします。たとえば\b\w+(?=ing\b)
、ingで終わる単語(ing以外)の前の部分を一致させると、たとえば、踊っているときに私が歌っているのを探す場合、singとdancが一致します。
(?<=exp)
アサーション後にゼロ幅ポジティブレビューとも呼ばれ、その発生の前の位置が式expと一致する可能性があることをアサートします。
たとえば、(?<=\bre)\w+\b
reを除いてreで始まる単語の後半に一致します。たとえば、本を検索すると、読書に一致します。長い数字の3桁ごとにカンマを追加する場合(もちろんそれは右から追加されます)、このように前と中にコンマを追加する必要がある部分を見つけることができます:((?<=\d)\d{3})+\b
それを使用して1234567890を検索すると、結果は234567890になります。
次の例では、これらのアサーションの両方を使用(?<=\s)\d+(?=\s)
しています。空白で区切られた一致する数値は、これらの空白を除いて、強調されています)
ゼロ幅アサーションを逆にする
\b\w*q[^u]\w*\b
文字u以外の文字qを含む単語に一致します。しかし、さらに多くのテストを行う場合(または直接観察するのに十分鋭い場合)、qが単語の最後にある場合(iraq、Benqなど)、この式は間違っていることがわかります。これは、[^u]
常に一致する文字があるため、qが単語の最後の文字である場合、以下[^u]
はqの後の単語の区切り文字(スペース、ピリオドなど)\w*\b
と一致し、以下は一致します次の言葉、それ\b\w*q[^u]\w*\b
はイラクの戦い全体と一致することができるので。負方向のゼロ幅アサーションは1つの位置のみに一致し、文字を消費しないため、この問題を解決できます。今、私たちは、この問題を解決するために行うことができます\b\w*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+)>)
そのような接頭辞が指定されています:山かっこで囲まれた単語(たとえば)、次に*(任意の文字列)、最後に接尾辞(?= </ \ 1>)。前述のエスケープ文字を使用する接尾辞の/に注意してください。\はキャプチャされた最初のグループを参照する後方参照であり、前の(W +)が一致するため、接頭辞が実際にその後、接尾辞があります。式全体が一致しているとの間でコンテンツ(ここでも、接頭辞と接尾辞自体は含まれません)
括弧のもう1つの用途は、構文(?#コメント)を通じてコメントを含めることです。以下の場合2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
の例:。