我试过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。 简而言之 - 如何验证子串的缺乏(以积极的方式) 感谢。
答案 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"
原始规范不是很清楚,但这里有一些基本事实:
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
(?<=#)[^#]+(?=#)
work? 如果您坚持使用否定外观,那么您可以根据实际需要使用这两种模式中的一种:
^(?!agg).*$
(see on rubular.com)
agg
^(?!.*agg).*$
(see on rubular.com)
agg
答案 1 :(得分:1)
简单的替代方案:
if (!csv.startsWith("agg") {
// do something
}
答案 2 :(得分:0)
检查contains
,这是String