代码之家  ›  专栏  ›  技术社区  ›  Rwky

如何使用正则表达式匹配不在其他字符串中的字符串?

  •  1
  • Rwky  · 技术社区  · 14 年前

    我试着将“string”的所有出现按如下顺序进行匹配 里面的那些@@

    as87dio u8u u7o @string@ ou os8 string os u
    

    i、 e.第二次出现时应匹配,而不是第一次

    3 回复  |  直到 14 年前
        1
  •  4
  •   steinar Justin CI    14 年前

    你可以用 negative lookahead and lookbehind :

    (?<!@)string(?!@)
    

    编辑

    注意:根据下面的Marks注释,这将不匹配 @string string@ .

        2
  •  2
  •   tinifni    14 年前

    您可以尝试:

    (?:[^@])string(?:[^@])
    
        3
  •  1
  •   Mark Thomas    14 年前

    如果您不想匹配某个字符,可以将其放在字符类(方括号)中,并以^字符开头,该字符会对其进行求反,例如 [^a]

    所以如果你想不在符号后面跟着字符串后面跟着另一个不在符号后面,你想

    [^@]string[^@]
    

    现在,问题是每个字符类都将匹配一个字符,因此在您的示例中,我们将得到“string”,其中包括前导和尾随空白。所以,还有一个结构告诉你不要匹配任何东西,那就是parens和a?:在开头。 (?: ) . 所以你用它来包围末端。

    (?:[^@])string(?:[^@])
    

    ^ 在字符类之外执行双重任务的字符)或在字符串末尾 $ . 所以我们必须使用OR字符 |

    (?:[^@]|^)string(?:[^@]|$)
    

    编辑:反向和正向lookahead是一个更简单(更聪明)的解决方案,但不是所有正则表达式引擎都可以使用。