Java RegEx元字符(。)和普通点?


150

在Java RegEx中,如何找出.我们在任何句子中使用的(点)元字符和普通点之间的差异。如何处理这种类型的其他元字符太像局面(*+\d,...)

Answers:


276

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


1
此修复程序也适用于bash
krivar 2014年

18
请注意,是否转义反斜杠取决于您提供正则表达式的方式。如果是硬编码,则需要使用:“ \\”。,如果从原始来源(例如文本文件)读取,则仅使用一个反斜杠:\。
保罗

25

其他成员提出的解决方案对我不起作用。

但是我发现了这一点:

在Java regexp中转义一个点 [.]


2
一样,\\.对我不起作用:\.抱怨.不需要逃脱,\\.认为它\.不是.\\\.而构建器抛出错误,这[.]是唯一可行的方法。
mithunc

1
@mithunc这很奇怪,\\.在字符串文字中可以为您提供\.正则表达式需要的内容,以将点视为文字点而不是任何字符的匹配器。
klaar

16

Perl样式的正则表达式(Java regex引擎或多或少基于正则表达式)将以下字符视为特殊字符:

.^$|*+?()[{\角色类别之外有特殊的意义,

]^-\字符类([...])中有特殊含义。

因此,您需要根据上下文来转义那些(并且仅那些)符号(或者,对于字符类,将它们放置在不会被误解的位置)。

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

其他一些会导致错误的结果,例如在Perl中\<被解释为文字<,但是在egrep它的意思是“单词边界”。

所以写-?\d+\.\d+\$匹配1.50$-2.00$等等和[(){}[\]]为一个字符类匹配各种支架/支架/括号。

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

进一步阅读:Jan Goyvaert的博客RegexGuru关于转义元字符


4

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


不必要地转义非特殊字符可能在某些语言中有效,但在另一些语言中可能无效,因此最好不要养成这种习惯。
蒂姆·皮茨克

1
不过,这个问题专门针对Java,而docs.oracle.com/javase/6/docs/api/java/util/regex / ...表示“无论字母字符是否为英文,都可以在非字母字符之前使用反斜杠未逸出结构的一部分。”
ChristofferHammarström,2015年

2

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

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

如果要结束检查句子是否以“。结尾,则必须在模式末尾添加[\。\ ] $。


0

我在JGrasp中做一些基本的数组,发现使用char [] []数组的访问器方法可以使用('。')放置单个点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.