【问题标题】:Java \ Pattern - how to write a pattern that verifies the lack of a string?Java \ Pattern - 如何编写验证缺少字符串的模式?
【发布时间】:2010-07-05 08:04:48
【问题描述】:

我从https://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html尝试过。

我有

Pattern PATTERN = Pattern.compile("agg{0}.*");
Matcher m = PATTERN.matcher("agg_0_4_Jul_2010_13_32_53_759_0.csv");

if (m.matches() == true)  => true.

我希望它返回 FALSE - 因为它确实在字符串开头包含 agg。 简而言之 - 如何验证缺少子字符串(以积极的方式)。 谢谢。

【问题讨论】:

  • 为什么需要它?我只是好奇。
  • 我不明白。你不能测试 m.matches() == false 吗?
  • 我想建立一个模式,声明:“一切,但..”

标签: java regex


【解决方案1】:

关于原始模式的说明

您的原始模式包含非常奇特的agg{0}。需要说的是,这种模式毫无意义。由于连接和重复之间的方式优先级,以及{0} 恰好是模式的零重复这一事实,这个agg{0} 就是ag

因此,您会得到以下结果:

Pattern PATTERN = Pattern.compile("agg{0}.*");
Matcher m = PATTERN.matcher("aged gouda yum yum!");
System.out.println(m.matches()); // prints "true"

为了说明重复和串联如何相互作用,以及有时如何需要分组,这里有更多示例:

System.out.println(  "hahaha".matches("ha{3}")    ); // prints "false"
System.out.println(  "haaa".matches("ha{3}")      ); // prints "true"
System.out.println(  "hahaha".matches("(ha){3}")  ); // prints "true"

参考文献


关于否定匹配

原始规范不是很清楚,但这里有一些基本事实:

这里有一些简单的例子:

System.out.println(   "Hello world!".startsWith("Hell")  ); // "true"
System.out.println(   "By nightfall".endsWith("all")     ); // "true"
System.out.println(   "Heaven".contains("joy")           ); // "false"

System.out.println( ! "Hello world!".startsWith("Hell")  ); // "false"
System.out.println( ! "By nightfall".endsWith("all")     ); // "false"
System.out.println( ! "Heaven".contains("joy")           ); // "true"

消极的环顾

如果 Java 的逻辑补码和String 的非正则表达式谓词检查的组合对您不起作用,您可以使用否定环视来否定模式上的匹配。

一般来说,如果您想否定 ^pattern$ 匹配的内容,并且由于某种原因您需要在正则表达式本身中完成此操作,则可以在 ^(?!pattern$).* 上进行匹配(也许使用单行模式以便点匹配一切)。

这是一个匹配 a*b* 的示例,并使用否定前瞻来否定它:

    String[] tests = {
        "aaabb",
        "abc",
        "bba",
        "aaaa",
        "bbbbbb",
        "what is this?",
    };
    for (String test : tests) {
        System.out.printf("[%s] %s - %s %n",
            test,
            test.matches("a*b*"),
            test.matches("(?!a*b*$).*")
        );          
    }

以上打印:

[aaabb] true - false 
[abc] false - true 
[bba] false - true 
[aaaa] true - false 
[bbbbbb] true - false 
[what is this?] false - true 

参考文献

相关问题


回到问题

如果您坚持使用否定环视,那么您可以根据您的实际需要使用以下两种模式之一:

【讨论】:

    【解决方案2】:

    简单的替代方案:

    if (!csv.startsWith("agg") {
      // do something
    }
    

    【讨论】:

      【解决方案3】:

      检查contains,是String的方法

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-02
        • 1970-01-01
        • 2015-03-15
        • 2013-07-03
        • 2010-11-25
        • 2017-11-12
        相关资源
        最近更新 更多