1. ホーム
  2. regex

[解決済み】Regexのlookahead、lookbehind、atomic groupについて

2022-03-28 06:54:23

質問

regex bodyにこれらのものがありましたが、何に使えるのかさっぱりわかりません。 どなたか例を挙げて、どのように機能するのか理解できる方はいらっしゃいますか?

(?!) - 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 は、その第1候補にマッチします。 foo として失敗します。 s がすぐに続かず、バックトラックが無効になっているため停止します。

非アトミックグループはバックトラックを許可します。後続のマッチングが失敗した場合、式全体にマッチするか、すべての可能性がなくなるまで、バックトラックして代替パターンを使用します。

  • (foo|foot)s に適用されます。 foots になります。

    1. 第1選択肢に一致 foo として失敗します。 s にはすぐには続きません。 foots で、その2番目の選択肢に戻る。
    2. その第2候補にマッチする foot として成功します。 s のすぐ後に続く foots で、停止します。

いくつかのリソース

オンラインテスター