PatternSyntaxException

时间:2012-02-08 14:00:46

标签: java regex patternsyntaxexception

以下字符串导致PatternSyntaxException

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

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

我该怎么做?

6 个答案:

答案 0 :(得分:3)

要匹配名称中包含.的所有字符串,请执行以下操作:

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

要打破它:

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

演示:

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

System.out.println(p.matcher("hello.txt").matches()); // true
System.out.println(p.matcher("hellotxt").matches());  // false

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


您获得PatternSyntaxException的原因:

*运算符将被解释为“前一个字符重复零次或多次”。由于您使用*开始表达,因此没有重复的字符,因此抛出异常。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

也许你的意思是:

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

如果没有,星号表示'任何字符',那么

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

答案 3 :(得分:0)

你必须写:

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

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

另一种方式可能是:

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

因为*[]之间出现时*.*失去了其他重要性。

如果要解析格式Pattern.compile(".+\\..+"); 的文件名,这应该足够了:

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

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

{{1}}

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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