用于文件过滤的Java regexp

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

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

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

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

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

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

谢谢

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

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

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

 ^(?:(?:...)(? 

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

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

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

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

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

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

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

 (?ms)^([^\r\n]{3}(? 

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

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

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

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

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

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

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