有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

问题是我无法掌握regexp“心智模型”的诀窍:

这是我用来选择要排除的文件的regexp

((ABC | XYZ))+\w*测试。xml

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

你能添加一些资源来帮助我与regexps的战斗吗

谢谢

下面的参考资料解释了关于regexpregular-expressions.info的很多事情


共 (4) 个答案

  1. # 1 楼答案

    What I would like to do is to select all the files that end with Test.xml but do not start with ABC or 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. # 2 楼答案

    只是为了好玩的正则表达式:

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

    即使这不是最具可读性的解决方案,也应该可以,这样可以避免您定义自己的自定义文件过滤器

    (?<!ABC|XYZ)是一个look-behind表达式,避免任何第四个字符(在前三个字符之后)前面加上想要避免的字符

  3. # 3 楼答案

    这些东西在没有正则表达式的情况下更容易、更快、更可读

    if (str.endsWith("Test.xml") && !str.startsWith("ABC"))
    
  4. # 4 楼答案

    这将选择不以A、B、C、X、Y或Z开头、以Test结尾的文件。xml:

    “[^ABCXYZ].*Test\\.xml\\z”

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