1. ホーム
  2. javascript

[解決済み] ?:, ?! と ?= の違い

2022-04-22 10:07:27

質問

これらの表現の意味を探したが、正確な違いが分からなかった。

このように言われています。

  • ?: 表現にマッチするが、キャプチャしない。
  • ?= サフィックスにマッチするが、キャプチャから除外される。
  • ?! サフィックスがない場合にマッチします。

これらを単純なRegExで使ってみましたが、どれも似たような結果になりました。

例えば、以下の3つの式は非常によく似た結果になります。

  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?!\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?=\.[a-zA-Z0-9]+)*
  • [a-zA-Z0-9._-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9]+)*

解決方法は?

との違いは ?=?! は、前者は与えられた式がマッチすることを必要とし、後者はそれが ない にマッチします。例えば a(?=b) は "ab" の "a" にはマッチしますが、 "ac" の "a" にはマッチしないことに注意してください。一方 a(?!b) は "ac" の "a" にマッチしますが、"ab" の "a" にはマッチしないことになります。

との違いは ?:?= は、その ?= はマッチ全体からその式を除外するのに対し ?: は、キャプチャグループを作成しないだけです。したがって、例えば a(?:b) は "ab" の "abc" にマッチするのに対し a(?=b) は "abc" の "a" にのみマッチします。 a(b) は "ab" にマッチします。 そして は、"b"を含むキャプチャを作成します。