【问题标题】:Regex for string containing one string, but not another [duplicate]包含一个字符串但不包含另一个字符串的字符串的正则表达式
【发布时间】:2016-09-06 16:57:12
【问题描述】:

在我们的项目中使用正则表达式匹配任何包含字符串的 url “/pdf/”:

(.+)/pdf/.+

需要对其进行修改,使其与同样包含“帮助”的网址不匹配

例子:

不应匹配:“/dealer/help/us/en/pdf/simple.pdf” 应该匹配:“/dealer/us/en/pdf/simple.pdf”

【问题讨论】:

  • 什么语言,什么风格的正则表达式,什么代码被用来匹配?
  • 值可以是Perl5风格的正则表达式。
  • “/pdf/”之后可以出现“帮助”吗?如果是这样,它应该匹配“/dealer/us/en/pdf/help.pdf”吗?
  • 你用什么工具来匹配正则表达式?例如,您使用 grep 吗?它是一种编程语言吗?

标签: regex regex-negation regex-lookarounds


【解决方案1】:

如果支持环视,这很容易实现:

(?=.*/pdf/)(?!.*help)(.+)

见a demo on regex101.com。

【讨论】:

    【解决方案2】:
    (?:^|\s)((?:[^h ]|h(?!elp))+\/pdf\/\S*)(?:$|\s)
    

    首先要匹配空格或行首

    (?:^|\s)
    

    然后我们匹配任何不是 或h 或任何h 后面没有elp 的东西,一次或多次+,直到我们找到/pdf/,然后匹配非空格字符\S任意次数*。

    ((?:[^h ]|h(?!elp))+\/pdf\/\S*)
    

    如果我们想在/pdf/之后检测help,我们可以从头开始重复匹配。

    ((?:[^h ]|h(?!elp))+\/pdf\/(?:[^h ]|h(?!elp))+)
    

    最后,我们匹配 或结束行/字符串 ($)

    (?:$|\s)
    

    完整的匹配将包括前导/尾随空格,并且应该被删除。如果您使用捕获组 1,则无需剥离末端。

    Example on regex101

    【讨论】:

    • 这很复杂,可以远更容易实现:)
    • @Jan 这提供了一个立即可用的捕获组,而不是匹配整行。此外,正因为如此,它可以匹配嵌入在文本中的 url,或者只是不由换行符分隔的 url 列表。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2014-03-23
    • 2011-07-22
    相关资源
    最近更新 更多