关于原始模式的说明
您的原始模式包含非常奇特的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"
参考文献
关于否定匹配
原始规范不是很清楚,但这里有一些基本事实:
-
String 类具有以下简单的非正则表达式方法:
- 您可以使用
! 一元 boolean 补码运算符来否定布尔值
这里有一些简单的例子:
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
参考文献
相关问题
回到问题
如果您坚持使用否定环视,那么您可以根据您的实际需要使用以下两种模式之一: