web-dev-qa-db-ja.com

正規表現全体を無効にする方法は?

(ma|(t){1})などの正規表現があります。 maおよびtと一致し、blaとは一致しません。

正規表現を無効にしたいので、blaおよびmaではなくtと一致する必要があります。この正規表現に何かを追加することによりblaと書けることは知っていますが、実際の正規表現はもっと複雑です。

82
IAdapter

ネガティブルックアラウンドを使用:(?!pattern)

ポジティブルックアラウンドを使用して、パターンが一致することをアサートできます。ネガティブルックアラウンドは反対です。パターンが一致しないことをアサートするために使用されます。一部のフレーバーはアサーションをサポートしています。一部では、後読みなどに制限があります。

Regular-expressions.infoへのリンク

こちらもご覧ください

その他の例

これらは、演習としておもちゃの問題に対する正規表現ソリューションを考え出す試みです。ルックアラウンドを使用できるさまざまな方法(ネスト、キャプチャーなど)を学習しようとしている場合、それらは教育的である必要があります。

90

正規表現に完全に一致する文字列のみを禁止したい場合(つまり、mmblaは許可されますが、mmは許可されません)、これはあなたが望むものです:

^(?!(?:m{2}|t)$).*$

(?!(?:m{2}|t)$)は負の値です lookahead ; 「現在の位置から始まり、次の数文字はnotmmまたはtで、その後に文字列。」先頭の開始アンカー(^)は、文字列の先頭に先読みが適用されるようにします。それが成功した場合、.*は先に進み、文字列を消費します。

参考までに、Javaのmatches()メソッドを使用している場合、^と最後の$は本当に必要ありませんが、害はありません。ただし、lookahead内の$は必須です。

48
Alan Moore
\b(?=\w)(?!(ma|(t){1}))\b(\w*)

これは、指定された正規表現用です。
\bは、単語の境界を見つけることです。
肯定的な先読み(?=\w)は、スペースを避けるためにここにあります。
元の正規表現に対するネガティブな見方は、その一致を防ぐことです。
そして最後に(\ w *)は残っているすべての単語をキャッチすることです。
単語を保持するグループはグループ3です。
単純な(?!パターン)は、サブストリングが一致するため機能しません
単純な^(?!(?: m {2} | t)$)。* $は粒度が完全な行なので機能しません

0
Ofer Skulsky