2010-10-28 66 views
7

我有這樣的正則表達式這是爲了去除句子分隔符(.?):簡單的Java正則表達式不工作

sentence = sentence.replaceAll("\\.|\\?$",""); 

它正常工作,它

"I am Java developer.""I am Java developer"

"Am I a Java developer?"轉換爲"Am I a Java developer"

但部署後w Ë發現它還在句子替換任何其他點作爲

"Hi.Am I a Java developer?"成爲"HiAm I a Java developer"

這究竟是爲什麼?

回答

14

pipe|)具有所有運營商的優先級最低。所以,你的正則表達式:

\\.|\\?$ 

被視爲:

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

其匹配的.任何地方字符串中和字符串的結束匹配一個?

要解決這個問題,你需要組.?在一起:

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

您還可以使用:

[.?]$ 

在一個字符類.?被視爲字面上所以你需要不逃避他們。

+0

感謝您的明確解釋。它現在有效。 – user489849 2010-10-28 09:04:51

+1

+1很好的解釋。 – jensgram 2010-10-28 09:07:18

+1

當你感謝某人,檢查他的答案是有用的,這是最低限度;-)。 +1的詳細解釋 – 2010-10-28 09:08:25

3

你已經忘記用圓括號擁抱句子結束符:

sentence = sentence.replaceAll("(\\.|\\?)$",""); 

更好的方法是使用[.?]$像@馬克拜爾斯建議。

sentence = sentence.replaceAll("[.?]$",""); 
7

您的問題是因爲alternation operator|的低precedence。你的正則表達式表示的比賽之一:

  • .隨時隨地
  • ?在一行的末尾。

使用字符類來代替:

"[.?]$" 
8

什麼你與"\\.|\\?$"說是「要麼一期」 「問號作爲最後一個字符」。

我會推薦"[.?]$"來代替,以避免令人困惑的轉義(當然還有不期望的結果)。

+0

不是唯一一個有這個想法的人,它似乎:) – jensgram 2010-10-28 09:02:31

+1

+1將分數與Mark Byers對齊,因爲它們是相同的答案:p – 2010-10-28 09:09:30