如何编写正则表达式以匹配任何不符合特定模式的字符串?我面临的情况是我必须匹配(A和~B)模式。
答案 0 :(得分:189)
您可以使用前瞻声明:
(?!999)\d{3}
此示例匹配除999
以外的三个数字。
但如果您没有使用此功能的正则表达式实现(请参阅Comparison of Regular Expression Flavors),您可能必须自己构建一个具有基本功能的正则表达式。
仅具有基本语法的兼容正则表达式为:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
这也匹配任何不是999
的三位数序列。
答案 1 :(得分:28)
如果要匹配字符串中的单词A而不匹配单词B.例如: 如果您有文字:
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
答案 2 :(得分:15)
匹配模式并使用宿主语言反转匹配的布尔结果。这将更加清晰易读。
答案 3 :(得分:7)
notnot,复活这个古老的问题,因为它有一个没有提到的简单解决方案。 (在为regex bounty quest进行一些研究时找到了您的问题。)
我面临的情况是我必须匹配(A和~B) 图案。
基本的正则表达式非常简单:B|(A)
您只需忽略整体匹配并检查第1组捕获,其中包含A。
一个例子(所有关于在正则表达式中解析html的免责声明):A是数字,B是<a tag
中的数字
正则表达式:<a.*?<\/a>|(\d+)
Demo(查看右下方的第1组)
参考
答案 4 :(得分:4)
常规语言的补充也是一种常规语言,但要构建它,您必须为常规语言构建DFA,并将任何有效状态更改为错误。有关示例,请参阅this。该页面未说明的是它将/(ac|bd)/
转换为/(a[^c]?|b[^d]?|[^ab])/
。从DFA转换回正则表达式并非易事。如果您可以更改正则表达式并更改代码中的语义(如之前建议的那样),则会更容易。
答案 5 :(得分:1)
答案 6 :(得分:0)
(B)|(A)
然后使用第2组捕获的内容......
答案 7 :(得分:0)
我的回答也可以解决您的问题:
https://stackoverflow.com/a/27967674/543814
$1
。$2
$2
在那里被捕获,你会避免。示例:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
第一个捕获组指定您希望避免的模式。最后一个捕获组捕获其他所有内容。只需宣读该群组$2
。