1

我正在尝试过滤文件夹中的文件。我需要不以“.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(..); 也是不允许的))

4

5 回答 5

5

我认为您正在寻找:

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

不需要正则表达式。将其放入 aFilenameFilter中,如下所示:

public accept(File dir, String name) {
  return ! name.endsWith(".xml-test");
}
于 2012-11-06T15:33:36.523 回答
4

的含义^取决于其在正则表达式中的位置。当符号[]作为第一个字符在字符类中时,表示字符类的否定;当它在字符类之外时,它意味着行的开头。

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

boolean isGoodFile = !Pattern.matches(regex, "database123.xml");
于 2012-11-06T15:32:48.703 回答
2

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

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

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

简单的!

于 2012-11-06T16:02:51.300 回答
1

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

但我建议您将 File#listFiles 方法与 FilenameFilter 实现一起使用:name.endsWith(".xml-test")

于 2012-11-06T15:35:06.453 回答
1

如果您真的需要使用正则表达式对其进行测试,那么您应该使用Pattern类中的否定后视:

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

这个怎么运作:

  1. 首先匹配整个字符串:从开始 (^) 所有字符 (.*),
  2. 您检查已经匹配的内容是否最后没有“.xml-test”(在您已经匹配的位置向后看),
  3. 你测试它是否是字符串的结尾。
于 2012-11-06T15:52:55.790 回答