1

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

例如,在我希望看到的结果中,public class base但没有public class myfirst:base 任何人可以帮助我吗?

4

4 回答 4

4

使用负前瞻:

public\s+class\s+(?!first|second).+
于 2010-07-07T16:24:50.417 回答
3

如果 Peter 是正确的并且您正在使用 Visual Studio 的Find功能,则应该可以:

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

:b匹配空格或制表符
~(...)是 VS 如何进行负前瞻
:i匹配 C/C++ 标识符

其余的是标准正则表达式语法:
^对于
$行首
.对于任何字符
*对于零个或多个
+对于一个或多个
|对于交替

于 2010-07-08T12:12:27.543 回答
1

其他两个答案都很接近,但可能由于不同的原因而失败。

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

注意负前瞻周围有一个(非捕获)组,以确保它不仅仅适用于第一个位置。

并且该组的限制较少 - 因为.不包括换行符,所以它使用 that 而不是\S,并且$不是必需的 - 这将排除指定的单词并匹配其他单词。

没有斜杠包裹表达式,因为这些不是所有内容都需要的,并且可能会使仅遇到基于字符串的正则表达式使用的人感到困惑。

如果仍然失败,请发布错误匹配或遗漏的确切内容,以及您使用的语言/IDE。

更新:
原来你正在使用 Visual Studio,它有自己的特殊正则表达式实现,出于某种深不可测的原因。所以,你会想试试这个:

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

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

于 2010-07-07T18:29:11.930 回答
0

这是应该为您工作的东西

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

第二个外观,头部可以更改为 $(end of line) 或适用于您的特定用例的另一个锚点,例如“{”

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

(?=\s|$)
于 2010-07-07T16:48:21.610 回答