use*_*849 7 java regex string operators operator-precedence
我有这个正则表达式,应该删除句子分隔符(.和?):
sentence = sentence.replaceAll("\\.|\\?$","");
Run Code Online (Sandbox Code Playgroud)
它工作正常,它转换
"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"
为什么会这样?
cod*_*ict 14
该管道(|)的所有运营商的优先级最低.所以你的正则表达式:
\\.|\\?$
Run Code Online (Sandbox Code Playgroud)
被视为:
(\\.)|(\\?$)
Run Code Online (Sandbox Code Playgroud)
其中匹配. 的任何地方字符串中和相匹配的?在端的字符串.
为了解决这个问题,你需要组.,并?一起为:
(?:\\.|\\?)$
Run Code Online (Sandbox Code Playgroud)
你也可以使用:
[.?]$
Run Code Online (Sandbox Code Playgroud)
在一个字符类中.,?字面上处理,所以你不需要逃避它们.
你的问题是,因为低优先级的的交替操作 |.正则表达式意味着匹配以下之一:
.任何地方或? 在一条线的尽头.改为使用字符类:
"[.?]$"
Run Code Online (Sandbox Code Playgroud)