用于文件过滤的Java正则表达式

时间:2008-12-15 09:32:53

标签: java regex

我想在Java中构建一个regexp,它将在FilenameFilter中传递以过滤目录中的文件。

问题是我无法掌握正则表达式“思维模式”:)

这是我想出的用于选择我想要排除的文件的正则表达式

((ABC | XYZ))+ \ W *的test.xml

我想要做的是选择所有以Test.xml结尾但不以ABC或XYZ开头的文件。

请你添加任何可以帮助我与regexp战斗的资源。

由于

以下资源解释了很多关于regexp regular-expressions.info

的内容

5 个答案:

答案 0 :(得分:9)

这种东西更容易,更快,更易读,没有正则表达式。

if (str.endsWith("Test.xml") && !str.startsWith("ABC"))

答案 1 :(得分:4)

  

我想做的是选择   所有以Test.xml结尾的文件   但请勿以ABCXYZ开头。

您可以使用此正则表达式匹配所有文件:

^(?:(?:...)(?<!ABC|XYZ).*?)?Test\.xml$

或者你做相反的事情,并采取匹配的每个文件:

^(?:ABC|XYZ).*?Test\.xml$

就个人而言,我发现第二种选择更为简单。

ABC_foo_Test.xml   // #2 matches
XYZ_foo_Test.xml   // #2 matches
ABCTest.xml        // #2 matches 
XYZTest.xml        // #2 matches
DEF_foo_Test.xml   // #1 matches
DEFTest.xml        // #1 matches
Test.xml           // #1 matches

答案 2 :(得分:1)

只是为了正则表达式的乐趣:

(?ms)^([^\r\n]{3}(?<!ABC|XYZ)[^\r\n]*?)?Test\.xml$

即使这不是最易读的解决方案,也应该可行,并且可以避免您定义自己的自定义文件过滤器。

(?<!ABC|XYZ)是一个后视表达式,避免任何第四个字符(在前三个字符之后)前面有你想要避免的内容。

答案 3 :(得分:1)

Tomalak和VonC提供的正则表达比他们需要的更复杂。在正则表达式的开头放一个负向前瞻比匹配三个字符和做一个负面的后观要清晰得多。如果您使用matches()方法,则甚至不必使用锚点(^$\z)。

public boolean accept(File dir, String name) {
    return name.matches("(?!ABC|XYZ).*Test\\.xml");
}

答案 4 :(得分:0)

这将选择不以A,B,C,X,Y或Z开头的文件,并在Test.xml中结束:

“[^ ABCXYZ]。*测试\\。XML \\ Z”

  • [^ ABCXYZ]:任何不在A,B,C,X,Y,Z集合中的字符。
  • 。*:任何字符,零次或多次
  • 测试:确切的文字“测试”
  • \\。:点字符(需要使用反斜杠进行转义,如果你在字符串中,那反斜杠需要通过反斜杠进行转义!)
  • xml:确切的文字“xml”
  • \\ z:输入的结尾