【问题标题】:Java regex negationJava 正则表达式否定
【发布时间】:2015-09-09 16:18:52
【问题描述】:

我有一个匹配 2 个字符串的正则表达式,一个不匹配。

(^[IVX\.]+.*$)|(^[a-z\\)]+.*$)

测试输入是:

a) prueba de inciso   ( find() = true ) 
I. prueba de fraccion ( find() = true )  
Prueba parrafo.       ( find() = false ) 

我怎么能否定这个?获得:

 a) prueba de inciso   ( find() = false ) 
I. prueba de fraccion ( find() = false )  
Prueba parrafo.       ( find() = true ) 

【问题讨论】:

    标签: java regex regex-negation


    【解决方案1】:

    您可以使用否定前瞻来确保文本不以特定模式开头。

    find() 与两个锚点一起使用 (^$) 并不是最佳选择。最好使用不带锚点的matches()

    你对编号列表的测试有点宽松,所以我把它变得更严格了。下面的示例显示了两个额外的文本来说明这一点。

    Pattern p = Pattern.compile("(?![IVX]+\\.\\s|[a-z]+\\)\\s).*");
    
    System.out.println(p.matcher("a) prueba de inciso").matches());
    System.out.println(p.matcher("I. prueba de fraccion").matches());
    System.out.println(p.matcher("Prueba parrafo").matches());
    System.out.println(p.matcher("I am good").matches());
    System.out.println(p.matcher("another test").matches());
    

    输出

    false
    false
    true
    true
    true
    

    【讨论】:

      【解决方案2】:

      您可以使用基于负前瞻的正则表达式:

      ^(?![IVX.]|[a-z)]).*$
      

      RegEx Demo

      ^(?![IVX.]|[a-z)]) 是负前瞻,如果起始字符满足这些条件,即字符类 [IVX.][a-z)],则匹配失败

      【讨论】:

        【解决方案3】:

        可能是最简单的方法 - ^[^IVX.a-z)].*$

        【讨论】:

        • 请编辑更多信息。纯代码和“试试这个”的答案是discouraged,因为它们不包含可搜索的内容,也没有解释为什么有人应该“试试这个”。我们在这里努力成为知识的资源。
        【解决方案4】:

        不要试图否定表达式,否定yourMatcher.find()的结果。

        Pattern yourPattern = Pattern.compile("^[IVX]+\\.|^[a-z]\\)");
        Matcher yourMatcher = yourPattern.matcher("Prueba parrafo. ");
        System.out.println(!yourMatcher.find());
                          ^^^^ (negation)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-31
          • 2014-01-13
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          • 1970-01-01
          相关资源
          最近更新 更多