gpt4 book ai didi

RegEx - 排除匹配的模式

转载 作者:行者123 更新时间:2023-12-03 15:17:33 30 4
gpt4 key购买 nike

我要排除以下模式。

make it cheaper
make it cheapere
makeitcheaper.com.au
makeitcheaper
making it cheaper
www.make it cheaper
ww.make it cheaper.com

我创建了一个正则表达式来匹配其中的任何一个。但是,我想得到除这些之外的所有东西。我不确定如何反转我创建的这个正则表达式。
mak(e|ing) ?it ?cheaper

上面的模式匹配所有列出的字符串。现在我希望它与其他一切相匹配。我该怎么做?

从搜索结果来看,我似乎需要负前瞻/回顾之类的东西。但是,我真的不明白。有人能指出我正确的方向吗?

最佳答案

你可以像这样把它放在一个消极的前瞻中:

(?!mak(e|ing) ?it ?cheaper)

就像那样是行不通的,因为如果您执行 matches 1,它不会匹配,因为你只是向前看,你实际上并没有匹配任何东西,而且,如果你做 find 1,它会匹配很多次,因为你可以从字符串中下一个字符与上面不匹配的很多地方开始。

要解决此问题,根据您的需要,我们有 2 种选择:
  • 如果要排除 的所有字符串正是 其中之一(即不排除“让它更便宜blahblah”),检查字符串的开始( ^ )和结束( $ ):
    ^(?!mak(e|ing) ?it ?cheaper$).*
    .* (零个或多个通配符)是实际发生的匹配。从第一个字符开始的负前瞻检查。
  • 如果要排除所有字符串 包含 其中之一,您可以确保在我们匹配的每个字符之前不匹配前瞻:
    ^((?!mak(e|ing) ?it ?cheaper).)*$

    另一种方法是在前瞻的开头添加通配符(即排除从字符串开头包含任何内容的所有字符串,然后是您的模式),但我目前没有看到任何优势(任何给定工具也不太可能支持任意长度的前瞻):
    ^(?!.*mak(e|ing) ?it ?cheaper).*

  • 因为 ^$ , 要么做 findmatches将适用于上述任何一种情况(尽管在 matches 的情况下, ^ 是可选的,而在 find 的情况下,预测之外的 .* 是可选的)。

    1:虽然它们可能不这么称呼,但许多语言都有相当于 matches的功能。和 find用正则表达式。

    以上是这个问题的严格正则表达式答案。

    更好的方法可能是坚持原来的正则表达式( mak(e|ing) ?it ?cheaper ),看看你是否可以直接用你正在使用的工具或语言来否定匹配。

    例如,在 Java 中,这将涉及到执行 if (!string.matches(originalRegex)) (注意 ! ,它否定返回的 bool 值)而不是 if (string.matches(negLookRegex)) .

    关于RegEx - 排除匹配的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18241463/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com