2013-12-09 172 views
2

我要替換查詢字符串值在Java中的查詢字符串的屬性值,但它創造了一些問題:替換使用正則表達式

問題1:其替換

String queryString = "?pid=1&name=Dell&cid=25"; 
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23"); 
System.out.println(nQueryString);   

輸出後取出「&」符號以上示例 ?pid=23name=Dell&cid=25

您可以看到其中刪除了「&「後pid

問題2:它不工作,如果我刪除了」?「來自queryString變量的符號。上面的例子中的

String queryString = "pid=1&name=Dell&cid=25"; 
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23"); 
System.out.println(nQueryString);   

輸出 ?pid=1&name=Dell&cid=25

我們可以說,正則表達式是行不通的,所以任何人都可以建議我更好的正則表達式這完全符合我的要求。

回答

1
queryString.replaceAll("(?<=[?&;])pid=.*?(?=[&;])", "pid=23") 

不同的是,我使用的是正前瞻:(?=[&;]),這是零長度,使其原子,而實際上不包括在經由replaceAll()更換,就像你原來正回顧後是沒有被取代。

或者,我們可以匹配,直到&;被發現,但不包括在更換,即:

queryString.replaceAll("(?<=[?&;])pid=[^&;]*", "pid=23") 

[^&;]^否定如下:&;,所以[^&;]*將匹配直到;或遇到了&

您的問題不起作用,因爲($|[&;])是一個非原子組,具體說是一個捕獲組,因此包含在替換中。注意:一個非捕獲組(?:$|[&;])也會在這裏失敗。

要你最後要注意,你使用正向後看爲?&,並且;,所以通過去除?,它將不再匹配,這是有道理的。

+0

是@Steve你是對的,但當我試圖用空格替換相同的查詢字符串時,它不刪除「&」符號。 'queryString.replaceAll(「(?<= [?&;])pid = [^&] *」,「」)'會給 '?&name = Dell&cid = 25' – user2518430

+0

@ user2518430你說你想保留它... –

+0

哦,是的,我只是想替換queryString值,但我只是試圖替換屬性。如果相同的正則表達式適用於我,我會更好,這就是我嘗試和評論的原因。謝謝@Steve,你的回答對我來說非常有用。 – user2518430

0

使用此regex代替:

String nQueryString = queryString.replaceAll("(?<=[?&;])pid=[^&]*", "pid=23"); 
//=> ?pid=23&name=Dell&cid=25 

這裏[^&]*被稱爲negation matching pattern,直到&被發現或找到字符串的其他結束從而留下的查詢字符串的其餘未實現,將符合查詢字符串值。