314

私は正規表現の体でこれらのものを見つけましたが、私はそれらを何に使うことができるかについての手がかりを持っていません。誰かが例を持っているので、それらがどのように機能するかを理解しようと試みることができますか?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind

(?>) - atomic group
4

3 に答える 3

1235

与えられた文字列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

    1. その最初の選択肢と一致し、すぐには続かないのでfoo失敗し、2番目の選択肢に戻ります。sfoots
    2. 2番目の選択肢と一致し、すぐに続くようにfoot成功し、停止します。sfoots

いくつかのリソース

オンラインテスター

于 2010-06-04T11:06:12.683 に答える
234

ルックアラウンドはゼロ幅アサーションです。正規表現をチェックし(現在の位置の右または左に向かって-前方または後方に基づいて)、一致が見つかった場合(正または負に基づいて)成功または失敗し、一致した部分を破棄します。それらは文字を消費しません-それらに続く正規表現のマッチング(もしあれば)は、同じカーソル位置から始まります。

詳細については、 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など)では、後読み部分の長さが固定されている必要があります。

  • アトミックグループは基本的に、トークンが一致すると、グループ内の後続のトークンを破棄/忘れます。原子グループの例については、このページを確認してください
于 2010-06-04T11:23:21.660 に答える
-1

急いで見回す。
先読みと後読みを区別する方法は?私と一緒に2分のツアーに参加してください:

(?=) - positive lookahead
(?<=) - positive lookbehind

仮定する

    A  B  C #in a line

今、私たちはBに尋ねます、あなたはどこにいますか?
Bには、場所を宣言するための2つのソリューションがあります。

1つは、BがAを前方に持ち、Cが結合されていること
です。

ご覧のとおり、2つのソリューションでは背後と前方が反対です。
正規表現はソリューション2です。

于 2018-04-04T15:08:13.503 に答える