繁体   English   中英

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

[英]Regex - how to match everything except a particular pattern

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

您可以使用前瞻断言:

(?!999)\d{3}

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


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

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

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

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

如果要匹配字符串中的单词 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

匹配模式并使用宿主语言反转匹配的 boolean 结果。 这将更加清晰和可维护。

不是,复活了这个古老的问题,因为它有一个没有提到的简单解决方案。 (在对正则表达式赏金任务进行一些研究时发现了您的问题。)

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

基本的正则表达式非常简单: B|(A)

您只需忽略整体匹配并检查将包含 A 的第 1 组捕获。

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

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

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

参考

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

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

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

模式 - 重新

str.split(/re/g) 

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

在这里测试

我在这里的回答也可能解决您的问题:

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

  • 而不是替换,你会使用匹配。
  • 而不是 group $1 ,您将阅读 group $2
  • $2在那里不被捕获,这是你会避免的。

例子:

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

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

(B)|(A)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM