【发布时间】:2023-03-20 16:58:01
【问题描述】:
以下字符串导致PatternSyntaxException:
Pattern.compile("*\\.*");
我想创建一个模式,以便我可以过滤所有具有以下格式名称的文件:"*.*"
我该怎么做?
【问题讨论】:
标签: java regex patternsyntaxexception
以下字符串导致PatternSyntaxException:
Pattern.compile("*\\.*");
我想创建一个模式,以便我可以过滤所有具有以下格式名称的文件:"*.*"
我该怎么做?
【问题讨论】:
标签: java regex patternsyntaxexception
要匹配名称中带有. 的所有字符串,您可以:
Pattern.compile(".*[.].*");
分解:
.* 匹配任意数量的任意字符[.] 匹配一个点。 (是的,\\. 也可以).* 匹配任意数量的任意字符演示:
Pattern p = Pattern.compile(".*[.].*");
System.out.println(p.matcher("hello.txt").matches()); // true
System.out.println(p.matcher("hellotxt").matches()); // false
请注意,只有一个点的字符串 "." 也匹配。为确保点前后有一些个字符,您可以将* 更改为+:.+[.].+。
你得到PatternSyntaxException的原因:
* 运算符将被解释为“前一个字符重复零次或多次”。由于您以* 开头表达式,因此没有要重复的字符,因此引发了异常。
【讨论】:
* 字符在正则表达式中的含义与在命令行中用作文件通配符时的含义不同。有关 Java 模式正则表达式语法的更多信息可以在这里找到:http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html
这将找到您要匹配的文本:
Pattern.compile(".*\\..*");
【讨论】:
也许你的意思是:
Pattern.compile("\\*\\.\\*");
如果不是,星号表示“任何字符”,那么
Pattern.compile(".*\\..*");
【讨论】:
如果您的意思是,您想过滤掉带有点“。”的文件。在它的名字中,使用这个:
Pattern.compile("[^\\.]*\\.[^\\.]*")
【讨论】:
.。
你必须写:
Pattern.compile("\\*\\.\\*");
因为* 在正则表达式中具有特殊含义(零个或多个)。所以你必须用\\ 来逃避它。
另一种方式可能是:
Pattern.compile("[*][.][*]");
因为* 在出现在[ 和] 之间时就失去了其他意义。
如果你想解析*.*格式的文件名,这就足够了:
Pattern.compile(".+\\..+");
要匹配任何文件名(可能有也可能没有扩展名),您可以使用
Pattern.compile(".+(\\..+)?");
【讨论】:
Pattern.compile(".*\\/.*\\..*"); 使用此模式。它将匹配所有包含点的文件名。星号是一个特殊字符。这意味着*之前的符号可以是0次或多次。所以你不能在没有字符的情况下写它。
例如,对于文件名C:/folder.1/folder.2/file.txt,模式将起作用:.* - C:/folder.1/folder.2(直到找到最后一个 / 字符之前的所有内容)\/ - / 字符.* - file(直到找到最后一个 . 字符(点))\\. - .(点).* - txt(. 之后的所有内容(实际上是文件扩展名))
【讨论】:
/?