如何使用正则表达式否定字符串

时间:2010-07-07 16:19:53

标签: visual-studio regex regex-negation

任何人都可以告诉我如何使用正则表达式来否定字符串吗? 我想找到所有以public class然后any thing except first,second开头的行,最后是其他任何内容。

例如,在结果中我希望看到public class base但不是public class myfirst:base 请问有谁能帮助我吗?

4 个答案:

答案 0 :(得分:3)

如果Peter是正确的并且您正在使用Visual Studio的Find功能,那么这应该可行:

^:b*public:b+class:b+~(first|second):i.*$

:b匹配空格或标签
~(...)是VS如何做出负面的预测 :i匹配C / C ++标识符

其余的是标准正则表达式语法:
^表示行的开头 $代表行尾 任何字符的. *为零或更多 一个或多个+ |进行更改

答案 1 :(得分:2)

使用否定前瞻:

public\s+class\s+(?!first|second).+

答案 2 :(得分:1)

其他两个答案都很接近,但可能因各种原因而失败。

public\s+class\s+(?:(?!first|second).)+

注意负向前瞻周围是否存在(非捕捉)组,以确保它不仅适用于第一个位置。

该群组的限制性较低 - 由于.排除了换行符,因此使用该换行符代替\S,而$不是必需的 - 这将排除指定的字词并与其他字词匹配

没有斜杠包装表达式,因为在所有内容中都不需要这些斜杠,并且可能会混淆仅使用基于字符串的正则表达式的人。

如果仍然失败,请发布错误匹配或错过的确切内容,以及您正在使用的语言/标识。

<强>更新
事实证明你正在使用Visual Studio,它有自己的special regex implementation,出于某种不可思议的原因。所以,你会想要尝试这个:

public:b+class:b+~(first|second)+$

我无法测试 - 如果它不起作用,请尝试删除$,否则您将不得不找到VS用户。或者更好的是,VS工程师负责这个愚蠢的非标准正则表达式。

答案 3 :(得分:0)

这是适合您的事情

/public\sclass\s(?:[^fs\s]+|(?!first|second)\S)+(?=\s|$)/

第二个看起来可以改成一个$(行尾)或另一个适用于你的特定用例的锚,比如可能是'{'

编辑:尝试将最后一部分更改为:

(?=\s|$)