任何人都可以告诉我如何使用正则表达式来否定字符串吗?
我想找到所有以public class
然后any thing except first,second
开头的行,最后是其他任何内容。
例如,在结果中我希望看到public class base
但不是public class myfirst:base
请问有谁能帮助我吗?
答案 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|$)