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

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

我想否定正则表达式,因此它必须匹配bla而不是mat通过向此正则表达式添加内容 。 我知道我可以写bla ,但实际的正则表达式更复杂。


使用负环视: (?! pattern )

积极的概念可以用来断言模式匹配。 否定的变换是相反的:它用于断言模式不匹配。 一些风味支持断言; 有些限制了后视等。

链接到regular-expressions.info

  • 前瞻和后视零宽度断言
  • 风味比较
  • 也可以看看

  • 如何将CamelCase转换为Java中的人类可读名称?
  • 所有不包含字符串的字符串的正则表达式?
  • 一个正则表达式,用于匹配没有被某个其他子字符串跟随的子字符串。
  • 更多例子

    这些尝试提出正则表达式解决玩具问题的练习; 如果你想学习使用lookarounds的各种方法(嵌套它们,使用它们捕获等),它们应该是教育性的:

  • codingBat plusOut使用正则表达式
  • codingBat repeatEnd使用正则表达式
  • 使用正则表达式编码字词结束

  • 假设你只想禁止完全匹配正则表达式的字符串(即, mmbla是好的,但mm不是),这是你想要的:

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

    (?!(?:m{2}|t)$)是负向预测; 它说:“从当前位置开始,接下来的几个字符不是mmt ,接着是字符串的结尾。” 开始处的起始锚点( ^ )确保在字符串的开始处应用前瞻。 如果成功, .*会继续并消耗字符串。

    仅供参考,如果您使用Java的matches()方法,您并不需要^和最终$ ,但它们不会造成任何伤害。 尽管如此,在预见中的$是必需的。


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

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

    链接地址: http://www.djcxy.com/p/76999.html

    上一篇: How to negate the whole regex?

    下一篇: No ending delimiter '/' found error