简单的 Java 正则表达式不起作用
我有这个正则表达式,它应该删除句子分隔符(.
和 ?
):
sentence = sentence.replaceAll("\\.|\\?$","");
它工作正常,可以转换
“我是 Java 开发人员。”
到 “我是 Java 开发人员”
“我是 Java 开发人员吗?”
到 “我是 Java 开发人员吗”
但部署后我们发现它还会替换句子中的任何其他点,因为
“Hi.Am I a Java Developer?”
变为 “HiAm I a Java Developer”
为什么会发生这种情况?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
管道 (
|
)具有所有运算符中最低的优先级。因此,您的正则表达式:被视为:
匹配字符串中的
.
任何位置,并匹配末尾的?
字符串的strong>。要解决此问题,您需要将
.
和?
组合在一起,如下所示:您还可以使用:
在字符类中
.
和?
按字面意思处理,因此您无需转义它们。The pipe (
|
) has the lowest precedence of all operators. So your regex:is being treated as:
which matches a
.
anywhere in the string and matches a?
at the end of the string.To fix this you need to group the
.
and?
together as:You could also use:
Within a character class
.
and?
are treated literally so you need not escape them.您所说的
"\\.|\\?$"
是“句号”或“最后一个字符为问号”。我建议改为
"[.?]$"
以避免令人困惑的转义(当然,也会产生不良结果)。What you're saying with
"\\.|\\?$"
is "either a period" or "a question mark as the last character".I would recommend
"[.?]$"
instead in order to avoid the confusing escaping (and undesirable result, of course).您的问题是由于 优先级 较低。正则表达式.info/alternation.html" rel="nofollow">交替运算符
|
。您的正则表达式意味着匹配以下之一:.
任何位置 或?
位于行尾。使用字符类代替:
Your problem is because of the low precedence of the alternation operator
|
. Your regular expression means match one of:.
anywhere or?
at the end of a line.Use a character class instead:
您忘记了用圆括号括起句子结尾字符:
更好的方法是像 @Mark Byers 建议的那样使用
[.?]$
。You have forgotten to embrace the sentence-ending characters with round brackets:
The better approach is to use
[.?]$
like @Mark Byers suggested.