正規表現の本文でこれらの項目を見つけましたが、それらを何に使用できるのかわかりません。誰かが例を持っているので、それらがどのように機能するかを理解しようとすることができますか?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
正規表現の本文でこれらの項目を見つけましたが、それらを何に使用できるのかわかりません。誰かが例を持っているので、それらがどのように機能するかを理解しようとすることができますか?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
回答:
与えられた文字列foobarbarfoo
:
bar(?=bar) finds the 1st bar ("bar" which has "bar" after it)
bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it)
(?<=foo)bar finds the 1st bar ("bar" which has "foo" before it)
(?<!foo)bar finds the 2nd bar ("bar" which does not have "foo" before it)
それらを組み合わせることもできます:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
(?=)
式Bが続く式Aを見つけます。
A(?=B)
(?!)
式Bが従わない式Aを見つけます。
A(?!B)
(?<=)
式Bが先行する式Aを見つけます。
(?<=B)A
(?<!)
式Bが先行しない式Aを検索します。
(?<!B)A
(?>)
アトミックグループはグループを終了し、グループ内で最初に一致したパターンの後に代替パターンを破棄します(バックトラッキングは無効です)。
(?>foo|foot)s
適用先foots
は最初の代替案foo
に一致し、s
すぐにフォローしないため失敗し、バックトラックが無効になると停止します非原子グループはバックトラックを許可します。後続のマッチングが失敗した場合、式全体の一致が見つかるか、すべての可能性がなくなるまで、バックトラックして代替パターンを使用します。
(foo|foot)s
foots
意志に適用:
foo
に一致し、s
すぐにフォローされないため失敗foots
し、2番目の選択肢に戻ります。foot
に一致し、のs
直後に続くように成功しfoots
、停止します。ルックアラウンドはゼロ幅のアサーションです。彼らは正規表現をチェックし(現在の位置の右または左-前方または後方に基づいて)、一致が見つかったときに成功または失敗し(正か負かに基づいて)、一致した部分を破棄します。それらは文字を消費しません-それらがあればそれに続く正規表現のマッチングは同じカーソル位置から始まります。
読むregular-expression.info詳細については。
構文:
(?=REGEX_1)REGEX_2
REGEX_1が一致する場合にのみ一致します。REGEX_1に一致した後、一致は破棄され、REGEX_2の検索は同じ位置から開始されます。
例:
(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
REGEX_1は[a-z0-9]{4}$
、4つの英数字とそれに続く行末に一致します。
REGEX_2は[a-z]{1,2}[0-9]{2,3}
、1つまたは2つの文字とそれに続く2つまたは3つの数字に一致します。
REGEX_1は文字列の長さが確かに4であることを確認しますが、文字を消費しないため、REGEX_2の検索は同じ場所で開始されます。ここで、REGEX_2は、文字列が他のいくつかのルールに一致することを確認します。先読みがないと、長さ3または5のストリングに一致します。
構文:
(?!REGEX_1)REGEX_2
REGEX_1が一致しない場合にのみ一致します。REGEX_1を確認した後、REGEX_2の検索は同じ位置から始まります。
例:
(?!.*\bFWORD\b)\w{10,30}$
先読み部分FWORD
は文字列のをチェックし、見つかった場合は失敗します。が見つからない場合FWORD
、先読みは成功し、次の部分で文字列の長さが10から30の間で、単語文字のみが含まれていることを確認しますa-zA-Z0-9_
後読みは先読みに似ています。現在のカーソル位置の後ろを見るだけです。javascriptなどの一部の正規表現フレーバーは、後読みアサーションをサポートしていません。そして、それをサポートするほとんどのフレーバー(PHP、Pythonなど)では、後読み部分を固定長にする必要があります。
(?=REGEX_1)REGEX_2
場合にのみ一致しますか?REGEX_2
REGEX_1