如何编写正则表达式来匹配任何不满足特定模式的字符串?我面临的情况是,我必须匹配(A 和 ~ B)模式。
你可以使用一个前瞻性的断言:
(?!999)\d{3}
此示例匹配 999以外的三个数字。
999
但是如果您碰巧没有具有此特性的正则表达式实现(请参阅 正则表达香精的比较) ,那么您可能必须自己构建具有基本特性的正则表达式。
仅具有基本语法的兼容正则表达式如下:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
这也匹配任何不是 999的三位数字序列。
根据模式进行匹配,并使用宿主语言来反转匹配的布尔结果。这将更加易读和易于维护。
常规语言的补语也是常规语言,但是要构造它,您必须为常规语言构建 DFA,并将任何有效的状态更改转换为错误。有关示例,请参见 这个。页面没有说的是它把 /(ac|bd)/转换成了 /(a[^c]?|b[^d]?|[^ab])/。从 DFA 到正则表达式的转换非常重要。如果您可以不加修改地使用正则表达式并更改代码中的语义,就会更加容易,就像之前建议的那样。
/(ac|bd)/
/(a[^c]?|b[^d]?|[^ab])/
图案重现
str.split(/re/g)
会返回除了图案之外的所有东西。
测试 给你
(B)|(A)
然后用第二组捕获的..。
如果你想匹配字符串中的一个单词 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
不是,重提这个古老的问题,因为它有一个简单的解决方案,没有被提及。(在研究 正则表达式赏金任务的时候发现了你的问题。)
我面临的情况是,我必须匹配(A 和 ~ B) 模式。
基本的正则表达式非常简单: B|(A)
B|(A)
您只需忽略整体匹配并检查 Group1捕获,其中将包含 A。
例如(包含所有关于在正则表达式中解析 html 的免责声明) : A 是数字,B 是 <a tag中的数字
<a tag
正则表达式: <a.*?<\/a>|(\d+)
<a.*?<\/a>|(\d+)
演示 (在右下窗格中查看 Group1)
参考
除了在 s1,s2,s3的情况下,如何匹配模式
如何匹配模式,除非..。
我的回答也许也能解决你的问题:
Https://stackoverflow.com/a/27967674/543814
$2
$1
例如:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
第一个捕获组指定您希望避免的模式。最后一个捕捉组捕捉其他所有东西。简单地读出那组,$2。