【问题标题】:PatternSyntaxException模式语法异常
【发布时间】:2023-03-20 16:58:01
【问题描述】:

以下字符串导致PatternSyntaxException:

Pattern.compile("*\\.*");

我想创建一个模式,以便我可以过滤所有具有以下格式名称的文件:"*.*"

我该怎么做?

【问题讨论】:

    标签: java regex patternsyntaxexception


    【解决方案1】:

    要匹配名称中带有. 的所有字符串,您可以:

    Pattern.compile(".*[.].*");
    

    分解:

    • .* 匹配任意数量的任意字符
    • [.] 匹配一个点。 (是的,\\. 也可以)
    • .* 匹配任意数量的任意字符

    演示:

    Pattern p = Pattern.compile(".*[.].*");
    
    System.out.println(p.matcher("hello.txt").matches()); // true
    System.out.println(p.matcher("hellotxt").matches());  // false
    

    请注意,只有一个点的字符串 "." 也匹配。为确保点前后有一些个字符,您可以将* 更改为+.+[.].+


    你得到PatternSyntaxException的原因:

    * 运算符将被解释为“前一个字符重复零次或多次”。由于您以* 开头表达式,因此没有要重复的字符,因此引发了异常。

    【讨论】:

      【解决方案2】:

      * 字符在正则表达式中的含义与在命令行中用作文件通配符时的含义不同。有关 Java 模式正则表达式语法的更多信息可以在这里找到:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

      这将找到您要匹配的文本:

      Pattern.compile(".*\\..*");
      

      【讨论】:

        【解决方案3】:

        也许你的意思是:

        Pattern.compile("\\*\\.\\*");
        

        如果不是,星号表示“任何字符”,那么

        Pattern.compile(".*\\..*");
        

        【讨论】:

          【解决方案4】:

          如果您的意思是,您想过滤掉带有点“。”的文件。在它的名字中,使用这个:

          Pattern.compile("[^\\.]*\\.[^\\.]*")
          

          【讨论】:

          • 无需在字符类中转义.
          【解决方案5】:

          你必须写:

          Pattern.compile("\\*\\.\\*");
          

          因为* 在正则表达式中具有特殊含义(零个或多个)。所以你必须用\\ 来逃避它。

          另一种方式可能是:

          Pattern.compile("[*][.][*]");
          

          因为* 在出现在[] 之间时就失去了其他意义。

          如果你想解析*.*格式的文件名,这就足够了:

          Pattern.compile(".+\\..+");
          

          要匹配任何文件名(可能有也可能没有扩展名),您可以使用

          Pattern.compile(".+(\\..+)?");
          

          【讨论】:

            【解决方案6】:

            Pattern.compile(".*\\/.*\\..*"); 使用此模式。它将匹配所有包含点的文件名。星号是一个特殊字符。这意味着*之前的符号可以是0次或多次。所以你不能在没有字符的情况下写它。
            例如,对于文件名C:/folder.1/folder.2/file.txt,模式将起作用:
            .* - C:/folder.1/folder.2(直到找到最后一个 / 字符之前的所有内容)\/ - / 字符
            .* - file(直到找到最后一个 . 字符(点))
            \\. - .(点)
            .* - txt. 之后的所有内容(实际上是文件扩展名))

            【讨论】:

            • 无效的转义序列(有效的是 \b \t \n \f \r \" \' \\ )
            • 我只是错过了一个 \ 用于转义 / 并且刚刚编辑了我的答案。
            • 你为什么要逃避/
            猜你喜欢
            • 2017-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-10
            相关资源
            最近更新 更多