Java正则表达式元字符(.)和普通点号的区别?

190
在Java RegEx中,如何找出元字符.和在任何句子中使用的普通点之间的区别。 如何处理其他元字符(例如*+\d等)的类似情况。
9个回答

338

如果您想使正则表达式中具有特殊含义的符号,如点号等成为正常字符,则需要使用反斜杠进行转义。由于 Java 中的正则表达式是普通的 Java 字符串,因此您需要转义反斜杠本身,因此需要使用两个反斜杠,例如 \\。


1
此修复也适用于Bash。 - krivar
31
请注意,是否需要转义反斜杠取决于您如何提供正则表达式。如果是硬编码,则需要使用: "\." ,如果从原始源(例如文本文件)读取,则仅使用单个反斜杠: . - Paul

41

其他成员提出的解决方案对我没有用。

但我发现了这个:

要在Java正则表达式中转义一个点,可以写成 [.]


5
同样, \\. 在我的情况下不起作用: \. 抱怨 . 不需要被转义, \\. 让它认为是 \. 而不是 ., \\\. 会导致构建器抛出错误, [.] 是唯一有效的方法。 - mithunc
1
@mithunc 这很奇怪,在字符串字面值中使用 \\. 会给你 \.,这正是正则表达式需要看到的点而不是任意字符匹配器。 - klaar
1
过去我遇到过需要进行另一层转义的情况,结果是\\。第一层转义后得到\\,接着下一层转义得到\。最后正则表达式将其转换为一个简单的点号。我不记得具体是什么情况需要这样做,但或许这对您的问题有所帮助。 - findusl

20

Perl风格的正则表达式(Java正则表达式引擎基本上是基于它的)将以下字符视为特殊字符:

.^$|*+?()[{\ 在字符类之外具有特殊含义,

]^-\ 在字符类内部具有特殊含义([...])。

因此,您需要根据上下文转义这些符号(仅限这些符号)或在字符类中将它们放置在不能被误解释的位置。

不必要地转义其他字符可能会起作用,但某些正则表达式引擎会将其视为语法错误,例如在.NET中,\_ 将导致错误。

有些转义字符会导致错误结果,例如在Perl中 \< 被解释为一个字面的 <,但在egrep中它的含义是“单词边界”。

因此,编写 -?\d+\.\d+\$ 来匹配 1.50$-2.00$ 等,并使用 [(){}[\]] 来匹配所有种类的括号/花括号/括号。

如果您需要将用户输入的字符串转换为正则表达式安全形式,请使用 java.util.regex.Pattern.quote

更多阅读:Jan Goyvaert的博客RegexGuru关于转义元字符的建议


5

使用反斜杠转义特殊字符。例如:\.\*\+\\d等等。如果您不确定,可以转义任何非字母字符,无论它是否特殊。请参见java.util.regex.Pattern的javadoc获取更多信息。


不必要地转义非特殊字符在某些语言中可能有效,但在其他语言中可能会失败,因此最好不要养成这个习惯。 - Tim Pietzcker
1
这个问题特别涉及到Java,http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#bs 上说:“反斜杠可以在非字母字符之前使用,无论该字符是否是未转义结构的一部分。” - Christoffer Hammarström

3

以下是您可以直接复制粘贴的代码:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

如果在这种情况下点号前后误留空格怎么办?最好的做法是考虑这些空格。

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

这里,\\s* 考虑到空格并只提供所需的拆分字符串。


1
我想匹配以 ".*" 结尾的字符串。 为此,我必须使用以下内容:
"^.*\\.\\*$"

有点儿傻,如果你仔细想一下 :D 这是什么意思。在字符串的开头可以是任何字符零次或多次,然后是一个点 ".",最后是星号 (*)。

我希望这对某些人有用。感谢 Fabian 提供反斜杠的方法。

只需使用 "\\.\\*$" 即可。如果字符串开头对您没有影响,则无需匹配开头。 - Ophidian
是的,你说得对。老实说,我想不起来这个用例了:/ - Atspulgs
不是真的为了帮助你,而是为了帮助看到你帖子的其他人 :P - Ophidian

0

我正在使用JGrasp进行一些基本的数组操作,发现可以通过访问器方法来使用'.'在char[][]数组中放置一个单独的点。


0
如果你想检查句子是否以"."结尾,那么你需要在模式的末尾添加[\.\]$。

0
我试图使用.folder来进行分割。对于这种情况,使用 \\.folder [.]folder 的解决方法都不起作用。

以下代码适用于我

String[] pathSplited = Pattern.compile("([.])(folder)").split(completeFilePath);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接