【问题标题】:Java regexp for file filtering用于文件过滤的 Java 正则表达式
【发布时间】:2010-09-26 22:35:04
【问题描述】:

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

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

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

((ABC|XYZ))+\w*Test.xml

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

能否请您添加任何可以帮助我解决正则表达式的资源。

谢谢

以下资源解释了很多关于正则表达式regular-expressions.info的事情

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      (?&lt;!ABC|XYZ) 是一个后向表达式,避免在任何第四个字符(前三个字符之后)前面加上您要避免的字符。

      【讨论】:

      • @Tomalak:谢谢,我刚刚修复了我的正则表达式和 +1 给你的(尽管我更喜欢 [\r\n] 到 '.'。
      • 但在这种情况下:文件名不能包含换行符。此外,在正常模式下,点与换行符不匹配,所以使用 [^\r\n] 对我来说似乎有点过头了。
      • 同意。我以前对'.'有过一些不好的经历。之前(假设我的条目没有任何换行符)。这样,我就避免了任何意外。
      • 我是用“.”、“[^\r\n]”还是单行模式,视情况而定,这里不一概而论。但是 always 明确也是可以的。 :) 我认为底线是:正则表达式在匹配“除了这个或那个之外的所有东西”方面真的很糟糕。在任何情况下,肯定匹配都更容易完成。
      【解决方案3】:

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

      要么用这个正则表达式匹配你的所有文件:

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

      或者你反其道而行之,获取所有匹配的文件:

      ^(?: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 匹配

      【讨论】:

        【解决方案4】:

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

        "[^ABCXYZ].*Test\\.xml\\z"

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

        【讨论】:

        • 恐怕不是这个问题。这与“ACD_Test.xml”不匹配,但应该匹配,并且双反斜杠对于正则表达式是错误的,它们是编程语言要求。
        • OP 确实说这是一个 Java 正则表达式,并且在 Java 字符串文字中,正则表达式转义序列中的反斜杠必须加倍。但是,开头的否定字符类肯定是错误的。
        【解决方案5】:

        Tomalak 和 VonC 提供的正则表达式比它们需要的更复杂。在正则表达式的开头放置一个否定的lookahead 比匹配三个字符并做一个否定的lookbehind 要清楚得多。如果你使用matches() 方法,你甚至不必使用锚点(^$\z)。

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

        【讨论】:

          猜你喜欢
          • 2016-03-05
          • 1970-01-01
          • 1970-01-01
          • 2013-04-10
          • 1970-01-01
          • 2021-11-01
          • 2023-03-02
          • 1970-01-01
          • 2018-06-23
          相关资源
          最近更新 更多