正規表現ではない演算子


109

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

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

したがって、正規表現が返す必要があるのは次のとおり(2001) nameです。

注:のようなものが\((?![\d]){4}[0-9a-zA-z _\.\-:]*\)機能しません((20019)どういうわけか一致します...)


1
上記のような文字列があり、正規表現の結果は次のようになり(2001) nameます。
ゾンネンハット2009

回答:


110

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

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

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

この(?!...)部分は、「のテキスト(したがって:先読み)がこれに一致しない(したがって、否定)の場合にのみ一致することを意味します。しかし、実際には一致する文字(つまり、幅がゼロ)を消費しません。

実際には、2つの軸を持つルックアラウンドの 4つの組み合わせがあります。

  • lookbehind / lookahead:ポイントのまたはの文字が考慮されるかどうかを指定します
  • 正/負:文字一致する必要があるかどうかを指定します。

ありがとう?!私も示唆されたものですが、私が使用している場合は、とにかく\((?![\d]{4})[0-9a-zA-z _\.\-:]+\)まだある(20019)ことに
Sonnenhut

あなたの質問の編集では、先読みの{4} 外側を入れ、このコメントではそれを内側に入れました。どれを試しましたか?また:あなたがしたい場合は(20019)一致し、その後、あなたが追加する必要があります\) 内側にあなたの先読み:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
ヨアヒム・ザウアー

上記の正規表現をコメントに含めると、動作します。でも分からない…なぜ次の部分を脱出するのかわからない\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)じゃあ、閉じてないブラケットがあるんだよね?
ゾンネンハット2009

)リテラル文字と一致させたいので、右括弧をエスケープし)ます(正規表現の最初と最後と同じように!)。それを一致させた、エスケープされていないを使用して先読みを終了し)ます。
Joachim Sauer

とった。私はそれらすべてのキャラクターに少し戸惑いました。ありがとうございました。
ゾンネンハット2009

182

よくわかりませんが、通常はいずれかのフォームでいくつかの回避策を使用できます

  • [^abc]aまたはbor cではなく、文字ごとに
  • または負の先読み:a(?!b)aその後にないb
  • または負の後読み:(?<!a)b、前にbないa

はい、否定的な後読み
jankins

8
しかし、[^abc]ではない意味すべきaか、bまたはc、ない「文字列ではありませんabc」。
雨が降る
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.