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

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)

在一个字符类中.,?字面上处理,所以你不需要逃避它们.


jen*_*ram 8

你所说的"\\.|\\?$"是"一个句号" "一个问号作为最后一个字符".

我会建议"[.?]$",以避免混乱的逃避(当然,不良结果).


Mar*_*ers 7

你的问题是,因为低优先级的的交替操作 |.正则表达式意味着匹配以下之一:

  • .任何地方
  • ? 在一条线的尽头.

改为使用字符类:

"[.?]$"
Run Code Online (Sandbox Code Playgroud)