首页 文章

如何否定整个正则表达式?

提问于
浏览
74

我有一个正则表达式,例如 (ma|(t){1}) . 它匹配 mat 并且与 bla 不匹配 .

我想否定正则表达式,因此它必须匹配 bla 而不是 matby adding something to this regex . 我知道我可以写 bla ,但实际的正则表达式更复杂 .

3 回答

  • 79

    使用否定的外观: (?! pattern )

    正面外观可用于断言模式匹配 . 否定的外观恰恰相反:它用于断言模式不匹配 . 一些风味支持断言;一些人对外观等有所限制 .

    指向regular-expressions.info的链接

    另见

    更多例子

    这些尝试是为玩具问题提出正则表达式解决方案作为练习;如果你正在尝试学习各种使用外观的方法(嵌套它们,使用它们来捕获等),它们应该具有教育意义:

  • 41

    假设您只想完全禁止与正则表达式匹配的字符串(即 mmbla 没问题,但 mm 不是),这就是您想要的:

    ^(?!(?:m{2}|t)$).*$
    

    (?!(?:m{2}|t)$) 是否定lookahead;它说“从当前位置开始,接下来的几个字符不是 mmt ,后面是字符串的结尾 . ”开头的锚点( ^ )确保在字符串的开头应用前瞻 . 如果成功,则 .* 继续并消耗字符串 .

    仅供参考,如果你使用're using Java'方法,你真的不需要 ^ 和最终 $ ,但它们不会造成任何伤害 . 但是,前瞻中的 $ 是必需的 .

  • 0
    \b(?=\w)(?!(ma|(t){1}))\b(\w*)
    

    这是给定的正则表达式 .
    \ b是找到单词边界 .
    前面的积极向前(?= \ w)就是为了避免空间 .
    对原始正则表达式的负面看法是为了防止它的匹配 .
    最后(\ w *)将捕获剩下的所有单词 .
    持有这些词的小组是第3组 .
    简单的(?!模式)将不起作用,因为任何子字符串都匹配
    简单的^(?!(?:m {2} | t)$) . * $将不起作用,因为它的粒度是实线

相关问题