正则expression式 – 如何匹配除特定模式以外的所有内容

如何编写正则expression式来匹配任何不符合特定模式的string? 我面临的情况是必须匹配(A和B)模式。

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

(?!999)\d{3} 

这个例子匹配999以外的三个数字。


但是,如果您碰巧没有使用此function进行正则expression式实现(请参阅正则expression式风格的比较 ),则可能必须自行构build带有基本function的正则expression式。

只有基本语法的兼容正则expression式是:

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

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

如果要在string中匹配单词A而不匹配单词B.例如:如果您有一个文本:

 1. I have a two pets - dog and a cat 2. I have a pet - dog 

如果你想search一条有宠物的文本行,而且没有猫,你可以使用这个正则expression式:

 ^(?=.*?\bdog\b)((?!cat).)*$ 

它只会find第二行:

 2. I have a pet - dog 

匹配模式并使用主机语言来反转匹配的布尔结果。 这将更清晰和可维护。

而不是复活这个古老的问题,因为它有一个没有提到的简单解决scheme。 (find你的问题,同时做一个正则expression式赏金任务的研究 。)

我面临的情况是必须匹配(A和B)模式。

这个基本的正则expression式非常简单: B|(A)

你只是忽略整个比赛,并检查第1组捕获,其中将包含A.

一个例子(关于在正则expression式中parsinghtml的所有免责声明):A是数字,B是<a tag内的数字

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

演示 (查看右下窗格中的组1)

参考

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

除非…匹配模式

常规语言的补充也是一种常规语言,但要构build它,必须为常规语言构buildDFA ,并使任何有效的状态更改为错误。 看到这个例子。 页面没有说的是它将/(ac|bd)/转换为/(a[^c]?|b[^d]?|[^ab])/ 。 从DFA转换回正则expression式并不是微不足道的。 如果您可以使用正则expression式并更改代码中的语义,就像前面提出的一样,这样会更容易。

模式 – 重新

 str.split(/re/g) 

将返回除模式外的所有内容。

在这里testing

我的答案也可以解决你的问题:

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

  • 而不是replace,你可以使用匹配。
  • 您可以读取组$2 ,而不是组$1
  • $2被捕获在那里,你会避免。

例:

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

第一个捕获组指定了你希望避免的模式。 最后一个捕获组捕获其他所有内容。 简单地读出那个组, $2

 (B)|(A) 

然后使用什么组2捕获…