【问题标题】:Regex - Match Entire String Unless [duplicate]正则表达式 - 匹配整个字符串,除非 [重复]
【发布时间】:2011-10-18 15:12:22
【问题描述】:

我需要编写一个正则表达式,它将匹配字符串中的所有内容,除非其中包含某个单词。以这个字符串为例:

http://12.34.567.890/sqlbuddy

匹配一切的表达式是:

^.*$

...如果它包含单词“sqlbuddy”,则需要对其进行修改,使其完全匹配字符串。我认为负前瞻可以做到这一点,但这对我不起作用。

比如我试过这个,不行:

^(?!sqlbuddy).*$

我应该如何修改这个?

【问题讨论】:

    标签: regex


    【解决方案1】:

    ...同样(对于其他人),如果您只想在 [long] 字符串(具有多个匹配项的长文本)的特定位置进行搜索,您可以使用:

    first_part_of_string(?!.*sqlbuddy.*)second_part_of_string
    

    或者,更宽容:

    first_part_of_string.*(?!.*sqlbuddy.*).*second_part_of_string
    

    【讨论】:

      【解决方案2】:

      该示例不起作用,因为它假定sqlbuddy 位于字符串的开头。您需要将其更改为以下内容,以便sqlbuddy 可以出现在字符串中的任何位置:

      ^(?!.*sqlbuddy.*).*$ 
      

      但是,如果您真的只是想检查您的字符串是否包含给定的单词,那么"http://12.34.567.890/sqlbuddy".contains("sqlbuddy") 就足够了。

      【讨论】:

      • 谢谢。我将它与 mod_rewrite 一起使用,所以我不能使用 .contains(),但它可以工作,下面的其他答案也是如此。但是,由于某种原因,它与使用gskinner.com/RegExr的正则表达式测试器不匹配
      • @Allen,看看 rubular,这是我用于正则表达式测试的工具,我非常喜欢它。
      • +1 但稍作调整:在sqlbuddy 之后不需要.*。这已经足够了:(?m)^(?!.*?sqlbuddy).*$(?m)^(?!.*sqlbuddy).*$ 取决于你是想偷懒还是回溯。
      【解决方案3】:

      另外,这对我有用:字符串 'sqlbuddy' 的位置无关紧要。

      ^((?!sqlbuddy).)*$

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 2020-09-19
        • 2020-10-29
        • 2023-03-09
        相关资源
        最近更新 更多