2012-12-02 35 views
2

我需要用另一個標記(我們可以從!或其他標記開始)替換特定標記(本例中爲?)。字符串的replaceAll方法將爲此工作。但是,如果碰巧符合標記action,我不想替換問號。 (這將是不好的!)使用String的replaceAll方法刪除所有標記,除非它們遵循特定的短語

我試過text = text.replaceAll("[^a][^c][^t][^i][^o][^n]\\?","!");但是沒有奏效。例如,我想"test.action?param=lol?omg";變爲test.action?param=lol!omg。我知道我可以做些傻事如

text.replaceAll("action\\?","%%%CRAZYTOKEN%%%") 
    .replaceAll("\\?","!") 
    .replaceAll("%%%CRAZYTOKEN%%%","action?"); 

但這只是看起來像浪費時間,特別是在大型絃樂。我寧願這樣做。

回答

2

你需要背後

text.replaceAll("(?<!action)\\?", "!"); 

負看看這個斷言,?遵循action

+0

所以,基本上去「拉德達德達,問號在哪裏,嘿有一個!等一下......你不好,因爲我的死亡之光令人敬畏的負面看法,我會繼續在我的快樂路上。「?問號在負面外觀語法的括號部分的開頭嗎?還是僅僅因爲我在尋找問號? – corsiKa

+0

The?是分開的。你對邏輯壽命是正確的。 – Bohemian

+0

它創造了奇蹟。謝謝! – corsiKa

2

只需使用一個zero-width negative lookbehind assertion只匹配? S的遵循action

text = text.replaceAll("(?<!action)\\?", "!"); 

注意?之前的額外\\。你需要避開?,因爲它是一個正則表達式中的特殊字符。

+0

16秒,這是殺手! :-( – corsiKa

+0

一點都不,我已經在同一秒內提交了幾乎相同的答案作爲另一個答案'':'' –

相關問題