正则表达式匹配模式但不包括其他模式

时间:2017-06-29 12:16:13

标签: regex

我想要一个匹配感谢的正则表达式,但是当字符串包含单词removals时将其排除。 所以联系 - 谢谢你应该返回一个积极但删除/联系 - 谢谢你应该返回一个负面的

我对正则表达式了解不多,发现有几篇帖子提到了负面的前瞻。我能想到的最好的是

(?!(?:清除))。*谢客

这显然是垃圾。有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:1)

在这种情况下,您理想的是负面的背后隐藏,因为您正在寻找"背后" (左侧)您要匹配的字词,以确保某些内容不存在。

这里的一个复杂因素是许多正则表达式引擎不允许可变宽度的负向外观。

但是如果你可以锚定到你想以某种方式匹配的字符串的开头,那么你可以使用该锚点的前瞻。

(?:\s|^)((?!removals)\S)+thank-you(?:\s|$)

bananas/fred-thank-you - MATCH.
bananas/fred-no-thank-you - MATCH.
bananas/thank-you-with-words-after - no match.
removals/fred-thank-you - no match.
non-removals/fred-thank-you - no match.
bananas/removals-thank-you - no match.
bananas/thank-you-supremovalsale - no match.
bananas/fred-sorry - no match.

我假设字符串中允许的字符是"除了空格之外的任何字符"。

所以它首先要查找字符串的开头或者一些空格;然后任何数量的非空格\ S字符不是字符串的开头"删除&#34 ;;然后字符串"谢谢你"。

但我怀疑你实际上寻找的东西有点不同,可能是这样的:

^(?!removals\/)\w+\/[-\w]*thank-you$

bananas/fred-thank-you - MATCH.
bananas/fred-no-thank-you - MATCH.
bananas/thank-you-with-words-after - no match.
removals/fred-thank-you - no match.
non-removals/fred-thank-you - MATCH.
bananas/removals-thank-you - MATCH.
bananas/thank-you-supremovalsale - no match.
bananas/fred-sorry - no match.

这假设结构是非常固定的:包括任何结束" / blah-blah-thank-you"的东西,除非第一个单词正好"删除/"。但是,如果不知道确切的规范,第一个似乎最有可能是有用的。

如果你不是试图从其他许多人那里提取这个字符串,而只是检查一个URL是否符合这个模式,那么你可以简化它:

^(?!.*removals).*thank-you

bananas/fred-thank-you - MATCH.
bananas/fred-no-thank-you - MATCH.
bananas/thank-you-with-words-after - MATCH.
removals/fred-thank-you - no match.
non-removals/fred-thank-you - no match.
bananas/removals-thank-you - no match.
bananas/thank-you-supremovalsale - no match.
bananas/fred-sorry - no match.

这只匹配任何包含" thank-you"而不是"删除"的字符串。