2010-03-15 61 views
0

對不起,如果這已被要求,我的搜索引起了許多離題主題帖子。正則表達式和轉義

我試圖從用戶定義的搜索字符串(通配符是「*」)到通配符「%」的PostgreSQL轉換通配符。

我想處理走,使得"%" => "\%""\*" => "*"

我知道我可以代替\*用別的東西代替*之前,然後交換回來,但我不喜歡,而是隻轉換*使用一種模式,在沒有進行\時選擇它。

String convertWildcard(String like) 
{ 
    like = like.replaceAll("%", "\\%"); 
    like = like.replaceAll("\\*", "%"); 
    return like; 
} 

Assert.assertEquals("%", convertWildcard("*")); 
Assert.assertEquals("\\%", convertWildcard("%")); 
Assert.assertEquals("*", convertWildcard("\\*")); // FAIL 

Assert.assertEquals("a%b", convertWildcard("a*b")); 
Assert.assertEquals("a\\%b", convertWildcard("a%b")); 
Assert.assertEquals("a*b", convertWildcard("a\\*b")); // FAIL 

想法歡迎。

編輯

爲了澄清,

我想,使1個或多個String.replaceAll通話將字符串轉換使

  • 出現%成爲\%的方法,
  • 發生*變爲%
  • 發生的\*變成*

最佳答案將使用最少撥打電話String.replaceAll

+1

中標記爲「正則表達式,文字串和反斜槓」的部分我不太瞭解這個問題。你能否澄清你想要做什麼以及問題是什麼? – cletus 2010-03-15 04:43:15

回答

1

你需要什麼叫做「消極的後顧之憂」。要選擇所有%\前面:

(?<!\\)%(純正則表達式)

使用它在Java中,你需要添加一些遮擋:

string.replaceAll("(?<!\\\\)%", "*");

+0

謝謝serg,以適應這個問題,你的答案是'like = like.replaceAll(「%」,「\\%」); like = like.replaceAll(「(?<!\\\\)\\ *」,「%」); like = like.replaceAll(「\\ *」,「*」);返回像;'。看起來對我來說是一個很好的答案。頁。 – pstanton 2010-03-15 04:50:37

+0

實際上,最後replaceall應該是'like = like.replaceAll(「\\\\\\ *」,「*」);' – pstanton 2010-03-15 04:57:59