我该如何编写正则表达式以匹配任何不符合特定模式的字符串?我面临一个情况,需要匹配一个(A和~B)模式。
你可以使用前瞻断言:
(?!999)\d{3}
这个例子匹配了三位数,但不包括 999
。
如果您的正则表达式引擎没有这个特性(请参见正则表达式引擎比较),您可能需要自己构建一个只具备基本语法的正则表达式。
一个兼容基本语法的正则表达式可以是:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
这也匹配任何不是999
的三位数字序列。
1. I have a two pets - dog and a cat
2. I have a pet - dog
^(?=.*?\bdog\b)((?!cat).)*$
2. I have a pet - dog
findstr
命令。它只提供了您期望在正则表达式工具中找到的一小部分功能;前瞻不在其中。(我刚刚自己添加了[tag:findstr]标签。) - Alan Moore使用主语言反转匹配结果的布尔值,并与模式进行比较。这样做会使代码更易读且更易于维护。
\d
替换为[[:digit:]]
也会失败。第一个参考提到它只适用于Perl和PHP:“有一种使用特定于Perl和PHP语法的变体可以实现相同的功能。” - miguelmorinreplace
,str.replace(/re/g, '')
,这样就不需要重新连接它们了。另外,如果你加上一个漂亮的尾随 \s?,比如 str.replace(/\re\s?/g, '')
,那么你就可以摆脱任何在字符串中间被替换而导致的重复空格。 - jakecraige(B)|(A)
然后使用第二组捕获的内容...
我的回答可能也能解决你的问题:
https://stackoverflow.com/a/27967674/543814
$1
,而是读取组 $2
。$2
设为非捕获组,你应该避免这样做。示例:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
第一个捕获组指定了您希望避免的模式。最后一个捕获组捕获其他所有内容。只需读取该组,$2
。
findstr
标签,因为所有答案都不适用于该标签。 - Wiktor Stribiżew