5

以下字符串原因PatternSyntaxException

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

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

我怎样才能做到这一点?

4

6 回答 6

3

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

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

分解它:

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

演示:

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

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

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


你得到的原因PatternSyntaxException

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

于 2012-02-08T14:05:37.220 回答
1

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

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

Pattern.compile(".*\\..*");
于 2012-02-08T14:04:18.097 回答
0

也许你的意思是:

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

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

Pattern.compile(".*\\..*");
于 2012-02-08T14:02:15.590 回答
0

你必须写:

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

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

另一种方法可能是:

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

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

如果要解析格式的文件名*.*,这应该足够了:

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

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

Pattern.compile(".+(\\..+)?");
于 2012-02-08T14:03:45.107 回答
0

如果你的意思是,你想用点“。”过滤掉文件。以它的名义,使用这个:

Pattern.compile("[^\\.]*\\.[^\\.]*")
于 2012-02-08T14:03:59.170 回答
0

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

于 2012-02-08T14:04:02.123 回答