110

たとえば、正規表現があります(ma|(t){1})。一致maし、一致tしませんbla

正規表現を否定したいので、この正規表現に何かを追加することで、一致する必要がblaあります。私は書くことができることを知っていますが、実際の正規表現はもっと複雑です。matbla

4

4 に答える 4

115

否定的なルックアラウンドを使用する:(?!pattern)

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

regular-expressions.info へのリンク

こちらもご覧ください

その他の例

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

于 2010-04-14T13:31:22.483 に答える
61

正規表現に完全に一致する文字列のみを禁止したい (つまり、mmbla大丈夫ですが、mmそうではない)と仮定すると、次のようになります。

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

(?!(?:m{2}|t)$)否定的な先読みです。「現在の位置から始めて、次の数文字はまたはではなく 、その後に文字列の末尾が続きます」と表示されます。先頭の開始アンカー ( ) により、文字列の先頭に先読みが適用されます。それが成功した場合、は先に進み、文字列を消費します。mmt^.*

参考までに、Java のメソッドを使用している場合、 theと finalmatches()は実際には必要ありませんが、害はありません。ただし、内部の先読みは必要です。^$$

于 2010-04-14T13:52:08.380 に答える