正则表达式-如何匹配除特定模式之外的所有内容

如何编写正则表达式来匹配任何不满足特定模式的字符串?我面临的情况是,我必须匹配(A 和 ~ B)模式。

261544 次浏览

你可以使用一个前瞻性的断言:

(?!999)\d{3}

此示例匹配 999以外的三个数字。


但是如果您碰巧没有具有此特性的正则表达式实现(请参阅 正则表达香精的比较) ,那么您可能必须自己构建具有基本特性的正则表达式。

仅具有基本语法的兼容正则表达式如下:

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

这也匹配任何不是 999的三位数字序列。

根据模式进行匹配,并使用宿主语言来反转匹配的布尔结果。这将更加易读和易于维护。

常规语言的补语也是常规语言,但是要构造它,您必须为常规语言构建 DFA,并将任何有效的状态更改转换为错误。有关示例,请参见 这个。页面没有说的是它把 /(ac|bd)/转换成了 /(a[^c]?|b[^d]?|[^ab])/。从 DFA 到正则表达式的转换非常重要。如果您可以不加修改地使用正则表达式并更改代码中的语义,就会更加容易,就像之前建议的那样。

图案重现

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)

您只需忽略整体匹配并检查 Group1捕获,其中将包含 A。

例如(包含所有关于在正则表达式中解析 html 的免责声明) : A 是数字,B 是 <a tag中的数字

正则表达式: <a.*?<\/a>|(\d+)

演示 (在右下窗格中查看 Group1)

参考

除了在 s1,s2,s3的情况下,如何匹配模式

如何匹配模式,除非..。

我的回答也许也能解决你的问题:

Https://stackoverflow.com/a/27967674/543814

  • 您将使用 Match 而不是 Replace。
  • 应该读取 $2组而不是 $1组。
  • $2组在那里没有被捕获,这是你应该避免的。

例如:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

第一个捕获组指定您希望避免的模式。最后一个捕捉组捕捉其他所有东西。简单地读出那组,$2