正则表达式NOT运算符不起作用

时间:2012-11-06 15:29:33

标签: java regex

我正在尝试过滤文件夹中的文件。我需要不以“.xml-test”结尾的文件。以下正则表达式按预期工作(ok1,ok2,ok3 = false,ok4 = true)

String regex = ".+\\.xml\\-test$";
boolean ok1 = Pattern.matches(regex, "database123.xml");
boolean ok2 = Pattern.matches(regex, "database123.sql");
boolean ok3 = Pattern.matches(regex, "log_file012.txt");
boolean ok4 = Pattern.matches(regex, "database.xml-test");

现在我只需要否定它,但由于某种原因它不起作用:

String regex = "^(.+\\.xml\\-test)$";

我仍然得到ok1,ok2,ok3 = false,ok4 = true

有什么想法吗? (正如人们指出的那样,这可以在没有正则表达式的情况下轻松完成。但是为了论证,假设我必须使用单个正则表达式模式而不是其他任何东西(即!Pattern.matches(..);也是不允许的))

5 个答案:

答案 0 :(得分:5)

我认为你在寻找:

if (! someString.endsWith(".xml-test")) {
  ...
}

不需要正则表达式。将其分为FilenameFilter,如下所示:

public accept(File dir, String name) {
  return ! name.endsWith(".xml-test");
}

答案 1 :(得分:4)

^的含义会根据其在正则表达式中的位置而改变。当符号在字符类[]内作为第一个字符时,它意味着否定字符类;当它在字符类之外时,它意味着行的开头。

否定匹配结果的最简单方法是在正则表达式中使用正模式,然后在Java端添加!以进行否定,如下所示:

boolean isGoodFile = !Pattern.matches(regex, "database123.xml");

答案 2 :(得分:2)

以下Java正则表达式断言字符串不以.xml-test

结尾
String regex = "^(?:(?!\\.xml-test$).)*$";

此正则表达式将字符串一次一个字符,并断言在每个位置,字符串的其余部分不是.xml-test

简单!

答案 3 :(得分:1)

^ - 在正则表达式中不是否定,这是表示行开头的符号 你可能需要(?!X)X,通过零宽度负前瞻

但我建议您使用File#listFiles方法和FilenameFilter实现: name.endsWith( “XML的试验”)

答案 4 :(得分:1)

如果你真的需要用正则表达式进行测试,那么你应该使用来自Pattern类的负面lookbehind:

String reges = "^.*(?<!\\.xml-test)$"

工作原理:

  1. 首先匹配整个字符串:从开始(^)所有字符(。*),
  2. 你检查已经匹配的东西是否在末尾没有“.xml-test”(在你已经匹配的位置看后面),
  3. 你测试它是否是字符串的结尾。