Java \ Pattern - 如何编写一个验证缺少字符串的模式?

时间:2010-07-05 08:04:49

标签: java regex

我试过http://java.sun.com/j2se/1.4.2/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 - 因为它确实包含字符串start中的agg。 简而言之 - 如何验证子串的缺乏(以积极的方式) 感谢。

3 个答案:

答案 0 :(得分:10)

关于原始模式的注释

您的原始图案包含非常奇特的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 

参考

相关问题


回到问题

如果您坚持使用否定外观,那么您可以根据实际需要使用这两种模式中的一种:

答案 1 :(得分:1)

简单的替代方案:

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

答案 2 :(得分:0)

检查contains,这是String

的方法