简单的Java正则表达式无法正常工作

7
我有一个正则表达式,它的作用是删除句子分隔符(.?):
sentence = sentence.replaceAll("\\.|\\?$","");

它可以将文本转换得很好,例如:

"I am Java developer." 转换为 "I am Java developer"

"Am I a Java developer?" 转换为 "Am I a Java developer"

但是在部署后,我们发现它也会替换句子中的其他点,例如:

"Hi.Am I a Java developer?" 变成了 "HiAm I a Java developer"

这是为什么呢?

4个回答

15

管道符 (|) 是所有操作符中优先级最低的。所以你的正则表达式:

\\.|\\?$

被视为:

(\\.)|(\\?$)

这个正则表达式匹配字符串中任何位置.,并且在字符串末尾匹配?

要修复这个问题,您需要将.?组合在一起,如下:

(?:\\.|\\?)$

你也可以使用以下代码:

[.?]$

在字符类中,.? 被视为字面量,因此您不需要对它们进行转义。


1
当你感谢某人时,请检查他的回答是否有用,这是最基本的礼貌;对于详细的解释,加上一个赞(+1)。 - Aurelien Ribon

8
你所说的 "\\.|\\?$" 的意思是“以句号结尾”或者“以问号结尾”。我建议使用 "[.?]$" 以避免混淆的转义(当然还要避免不良结果)。

好像不止我有这个想法 :) - jensgram
1
+1 以与 Mark Byers 的分数对齐,因为它们是相同的答案 :p - Aurelien Ribon

7
你的问题是由于交替运算符|优先级太低造成的。你的正则表达式的意思是匹配以下之一:
  • . 任何地方 或者
  • ? 在行末。
请使用字符类代替:
"[.?]$"

3
您忘记用圆括号包裹句子结束符了:
sentence = sentence.replaceAll("(\\.|\\?)$","");

更好的方法是使用@Mark Byers建议的[.?]$
sentence = sentence.replaceAll("[.?]$","");

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