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

时间:2009-03-04 18:37:55

标签: regex findstr

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

8 个答案:

答案 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组)

参考

How to match pattern except in situations s1, s2, s3

How to match a pattern unless...

答案 4 :(得分:4)

常规语言的补充也是一种常规语言,但要构建它,您必须为常规语言构建DFA,并将任何有效状态更改为错误。有关示例,请参阅this。该页面未说明的是它将/(ac|bd)/转换为/(a[^c]?|b[^d]?|[^ab])/。从DFA转换回正则表达式并非易事。如果您可以更改正则表达式并更改代码中的语义(如之前建议的那样),则会更容易。

答案 5 :(得分:1)

模式 - 重新

str.split(/re/g) 

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

测试here

答案 6 :(得分:0)

(B)|(A)

然后使用第2组捕获的内容......

答案 7 :(得分:0)

我的回答也可以解决您的问题:

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

  • 您可以使用Match。
  • 代替Replace
  • 您可以阅读群组$1
  • ,而不是群组$2
  • 群组$2在那里被捕获,你会避免。

示例:

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

第一个捕获组指定您希望避免的模式。最后一个捕获组捕获其他所有内容。只需宣读该群组$2