我想在Java中构建一个regexp,它将在FilenameFilter中传递以过滤目录中的文件。
问题是我无法掌握正则表达式“思维模式”:)
这是我想出的用于选择我想要排除的文件的正则表达式
((ABC | XYZ))+ \ W *的test.xml
我想要做的是选择所有以Test.xml结尾但不以ABC或XYZ开头的文件。
请你添加任何可以帮助我与regexp战斗的资源。
由于
以下资源解释了很多关于regexp regular-expressions.info
的内容答案 0 :(得分:9)
这种东西更容易,更快,更易读,没有正则表达式。
if (str.endsWith("Test.xml") && !str.startsWith("ABC"))
答案 1 :(得分:4)
我想做的是选择 所有以
Test.xml
结尾的文件 但请勿以ABC
或XYZ
开头。
您可以使用此正则表达式匹配所有文件:
^(?:(?:...)(?<!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”