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

Eya*_*yal 2 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.
Run Code Online (Sandbox Code Playgroud)

我希望这返回FALSE - 因为它确实包含字符串start中的agg.总之 - 如何验证子串的缺乏(以积极的方式)谢谢.

pol*_*nts 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"
Run Code Online (Sandbox Code Playgroud)

为了说明重复和连接如何相互作用,以及有时需要分组,这里有一些例子:

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"
Run Code Online (Sandbox Code Playgroud)

参考


否定匹配

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

以下是一些简单的例子:

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"
Run Code Online (Sandbox Code Playgroud)

负面的看法

如果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*$).*")
        );          
    }
Run Code Online (Sandbox Code Playgroud)

以上打印:

[aaabb] true - false 
[abc] false - true 
[bba] false - true 
[aaaa] true - false 
[bbbbbb] true - false 
[what is this?] false - true 
Run Code Online (Sandbox Code Playgroud)

参考

相关问题


回到这个问题

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