web-dev-qa-db-ja.com

正規表現ではない演算子

正規表現にNOT演算子はありますか?その文字列のように:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

すべての\([0-9a-zA-z _\.\-:]*\)を削除したいが、1年である(2001)は削除したくない。

したがって、正規表現が返す必要があるのは(2001) nameでなければなりません。

注:\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)のようなものは機能しません((20019)も何らかの形で一致します...)

64
Sonnenhut

いいえ、直接not演算子はありません。少なくともあなたが望む方法ではありません。

ただし、ゼロ幅の負の先読みを使用できます。

\((?!2001)[0-9a-zA-z _\.\-:]*\)

(?!...)部分は、「テキストfollowing(したがってlookahead)thisdoes n't(したがって:負)これに一致しますが、実際には一致する文字を消費しません(したがって、幅ゼロ)。

実際には、2つの軸を持つ lookarounds の4つの組み合わせがあります。

  • lookbehind/lookahead:ポイントの文字beforeまたはafterを考慮するかどうかを指定します
  • positive/negative:文字mustが一致するかmust notが一致するかを指定します。
72
Joachim Sauer

完全ではありませんが、一般的には、通常、フォームのいずれかでいくつかの回避策を使用できます

  • [^abc]、これはaまたはbまたはcではなく、文字ごとです。
  • または負の先読み:a(?!b)、これはaの後にbが続かない
  • またはネガティブな後読み:(?<!a)b、これはbであり、aの前にはありません
124
Johan Sjöberg