正则表达式不是运算符


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
Sonnenhut

Answers:


112

不,没有直接的非运算符。至少不是您希望的方式。

您可以使用零宽度的负前瞻,但是:

\((?!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 _\.\-:]+\)
Joachim Sauer

在您的评论中使用上面的正则表达式,它可以工作。但是我不明白。。。我不明白为什么你逃脱了下一部分。\((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)然后有一个没有闭合的支架,不是吗?
Sonnenhut

我逃脱了右括号,)因为我想匹配文字字符)(就像您在正则表达式的开头和结尾一样!)。然后,在完成匹配之后,我使用了unscapeed结束了前瞻)
Joachim Sauer

得到它了。所有的角色让我有些困惑。谢谢。
Sonnenhut

183

不完全是,尽管通常您可以在其中一种表格上使用一些替代方法

  • [^abc],每个字符都不是abc
  • 或否定的前瞻:a(?!b)a之后不跟b
  • 或负回顾后发:(?<!a)b,这是b不被preceededa

是的,我想负向后看为b -引用(<一个?!):regular-expressions.info/lookaround.html
jankins

8
[^abc]应表示不是aor bc,不是“不是字符串abc”。
下雨
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.