私は正規表現の体でこれらのものを見つけましたが、私はそれらを何に使うことができるかについての手がかりを持っていません。誰かが例を持っているので、それらがどのように機能するかを理解しようと試みることができますか?
(?!) - 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
失敗し、2番目の選択肢に戻ります。s
foots
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など)では、後読み部分の長さが固定されている必要があります。
急いで見回す。
先読みと後読みを区別する方法は?私と一緒に2分のツアーに参加してください:
(?=) - positive lookahead
(?<=) - positive lookbehind
仮定する
A B C #in a line
今、私たちはBに尋ねます、あなたはどこにいますか?
Bには、場所を宣言するための2つのソリューションがあります。
1つは、BがAを前方に持ち、Cが結合されていること
です。
ご覧のとおり、2つのソリューションでは背後と前方が反対です。
正規表現はソリューション2です。