【问题标题】:Regex which matches text not ending with specified string匹配不以指定字符串结尾的文本的正则表达式
【发布时间】:2020-05-15 13:27:40
【问题描述】:

我正在尝试仅匹配不以特殊字符串结尾的文本。

\/.*\/.*(?!\.htm$)

这应该匹配:

/blabla/test

但不是:

/bla/blabla.htm

我正在使用负前瞻,但它没有按预期工作。如何确保不匹配以.htm 结尾的字符串?

【问题讨论】:

  • 如果您正在处理 URL,您的宿主语言可能有内置的功能可以为您完成。用正则表达式重写轮子没有意义。

标签: regex


【解决方案1】:

您可以在这里找到答案: Regex for string not ending with given suffix

在您的示例中将如下所示

\/.*\/.*(?<!.htm)$

这是对该正则表达式的测试:https://regex101.com/r/QFtwEA/2

这也是可行的

^(?!.*\.htm$)\/.*\/.*$

这是对该正则表达式的测试:https://regex101.com/r/yN4tJ6/354

【讨论】:

    【解决方案2】:

    您尝试的模式在这两种情况下都会匹配,因为.* 将首先匹配到字符串的末尾。否定的前瞻是一个断言并且是非消耗性的,在这种情况下断言,虽然在字符串的末尾,但确保右侧没有.htm

    这是真的,因为它在字符串的末尾。

    如果不能连续出现2个斜线,但必须有2个斜线,则可以使用

    ^/[^/\r\n]+/(?!.*\.htm$)[^/\r\n]+$
    

    解释

    • ^ 字符串开始
    • /[^/\r\n]+/ 匹配/,然后匹配除换行符或/ 之外的任何字符,然后再次匹配/
    • (?!.*\.htm$) 负前瞻,断言字符串不以.htm 结尾
    • [^/\r\n]+ 匹配除换行符或 / 之外的任何字符的 1 次以上
    • $字符串结束

    Regex demo

    如果正斜杠可以出现多次:

    ^/(?:[^/\r\n]+/)*(?!.*\.htm$)[^/\r\n]+$
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 2021-01-17
      • 2015-08-01
      • 1970-01-01
      • 2015-09-28
      • 2011-09-23
      相关资源
      最近更新 更多