(ma|(t){1})
などの正規表現があります。 ma
およびt
と一致し、bla
とは一致しません。
正規表現を無効にしたいので、bla
およびma
ではなくt
と一致する必要があります。この正規表現に何かを追加することにより。 bla
と書けることは知っていますが、実際の正規表現はもっと複雑です。
ネガティブルックアラウンドを使用:(?!
pattern
)
ポジティブルックアラウンドを使用して、パターンが一致することをアサートできます。ネガティブルックアラウンドは反対です。パターンが一致しないことをアサートするために使用されます。一部のフレーバーはアサーションをサポートしています。一部では、後読みなどに制限があります。
これらは、演習としておもちゃの問題に対する正規表現ソリューションを考え出す試みです。ルックアラウンドを使用できるさまざまな方法(ネスト、キャプチャーなど)を学習しようとしている場合、それらは教育的である必要があります。
正規表現に完全に一致する文字列のみを禁止したい場合(つまり、mmbla
は許可されますが、mm
は許可されません)、これはあなたが望むものです:
^(?!(?:m{2}|t)$).*$
(?!(?:m{2}|t)$)
は負の値です lookahead ; 「現在の位置から始まり、次の数文字はnotmm
またはt
で、その後に文字列。」先頭の開始アンカー(^
)は、文字列の先頭に先読みが適用されるようにします。それが成功した場合、.*
は先に進み、文字列を消費します。
参考までに、Javaのmatches()
メソッドを使用している場合、^
と最後の$
は本当に必要ありませんが、害はありません。ただし、lookahead内の$
は必須です。
\b(?=\w)(?!(ma|(t){1}))\b(\w*)
これは、指定された正規表現用です。
\bは、単語の境界を見つけることです。
肯定的な先読み(?=\w)は、スペースを避けるためにここにあります。
元の正規表現に対するネガティブな見方は、その一致を防ぐことです。
そして最後に(\ w *)は残っているすべての単語をキャッチすることです。
単語を保持するグループはグループ3です。
単純な(?!パターン)は、サブストリングが一致するため機能しません
単純な^(?!(?: m {2} | t)$)。* $は粒度が完全な行なので機能しません