【发布时间】:2010-10-11 08:16:51
【问题描述】:
如何编写一个正则表达式来匹配任何不符合特定模式的字符串?我遇到了必须匹配(A 和 ~B)模式的情况。
【问题讨论】:
-
PCRE 最适合这个:参见Regex Pattern to Match, Excluding when… / Except between。我删除了
findstr标签,因为这里的所有答案都对该标签无效。
如何编写一个正则表达式来匹配任何不符合特定模式的字符串?我遇到了必须匹配(A 和 ~B)模式的情况。
【问题讨论】:
findstr 标签,因为这里的所有答案都对该标签无效。
您可以使用前瞻断言:
(?!999)\d{3}
此示例匹配除999 之外的三个数字。
但如果您碰巧没有使用此功能的正则表达式实现(请参阅Comparison of Regular Expression Flavors),您可能必须自己构建具有基本功能的正则表达式。
只有基本语法的兼容正则表达式是:
[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
如果您要搜索 HAVE a dog 表示宠物并且 DOESN'T have cat 的文本行,您可以使用以下正则表达式:
^(?=.*?\bdog\b)((?!cat).)*$
它只会找到第二行:
2. I have a pet - dog
【讨论】:
findstr 命令。它仅提供您期望在正则表达式工具中找到的功能的一小部分;前瞻不在其中。 (我自己刚刚添加了findstr 标签。)
匹配模式并使用宿主语言反转匹配的布尔结果。这将更加清晰和可维护。
【讨论】:
不是,复活这个古老的问题,因为它有一个没有提到的简单解决方案。 (在为regex bounty quest 做一些研究时发现了你的问题。)
我面临必须匹配 (A 和 ~B) 的情况 模式。
基本的正则表达式非常简单:B|(A)
您只需忽略整体匹配并检查包含 A 的第 1 组捕获。
一个例子(包含所有关于在正则表达式中解析 html 的免责声明):A 是数字,B 是 <a tag 中的数字
正则表达式:<a.*?<\/a>|(\d+)
Demo(查看右下窗格中的第 1 组)
参考
【讨论】:
\d 替换为 [[:digit:]] 之后也是如此。 The first reference 提到它特定于 Perl 和 PHP:“使用特定于 Perl 和 PHP 的语法的变体可以实现相同的功能。”
【讨论】:
【讨论】:
replacestr.replace(/re/g, ''),则无需重新加入它们。如果你在一个漂亮的尾随 \s 中加入?像str.replace(/\re\s?/g, '') 这样你就可以摆脱在字符串中间被替换的任何重复空格
我在这里的回答也可能解决你的问题:
https://stackoverflow.com/a/27967674/543814
$2,而不是组$1。$2 组在此处设置为非捕获,您可以避免这种情况。例子:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
第一个捕获组指定您希望避免的模式。最后一个捕获组捕获其他所有内容。只需读出该组,$2。
【讨论】:
(B)|(A)
然后使用第 2 组捕获的内容...
【讨论】: