Java \ Pattern – 如何编写一个validation缺少字符串的模式?

我试过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。 总之 – 如何validation子串的缺乏(以积极的方式)谢谢。

关于原始图案的注释

您的原始模式包含非常特殊的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" 

参考

  • regular-expressions.info/Repetition和Round Brackets for Grouping

否定匹配

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

  • String类具有以下简单的非正则表达式方法:
    • boolean startsWith(String prefix)
    • boolean endsWith(String suffix)
    • boolean contains(CharSequence s)
  • 您可以使用!来否定布尔值! 一元boolean补语运算符
    • 另请参见: JLS 15.15.6逻辑补码运算符!

以下是一些简单的例子:

 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 

参考

  • regular-expressions.info/Lookarounds

相关问题

  • 正则表达式匹配1234,1324,2341({1,2,3,4}的所有排列)
  • 检查四个零的每个子字符串是否后跟至少四个使用正则表达式的子字符串
  • 正则表达式(?<=#)[^#]+(?=#)工作?
  • 为什么需要否定正则表达式?

回到这个问题

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

  • ^(?!agg).*$ ( 参见rubular.com )
    • 这匹配不以agg开头的字符串
  • ^(?!.*agg).*$ ( 参见rubular.com )
    • 这匹配不包含agg字符串

简单的选择:

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

检查contains ,它是String的方法