2011-07-05 43 views
2

我有一個匹配給定模式的正則表達式(很明顯,這是正則表達式的做法),並用錨標記替換該模式幷包含捕獲的組。這部分工作可愛。URL編碼匹配的組

String substituted = content.asString().replaceAll("\\[{2}((?:.)*?)\\]{2}", 
             "<a href=\"#!p\\:$1\">$1</a>"); 

我無法弄清楚如何在href屬性中使用它之前對捕獲的組進行編碼。

實施例的輸入

  1. [[a]]
  2. [[a b]]
  3. [[a&b]]

期望輸出

  1. <a href="a">a</a>
  2. <a href="a+b">a b</a>
  3. <a href="a%26b">a&b</a>

有沒有辦法做到這一點?我還沒有發現任何看起來有用的東西,但是一旦我問我通常會找到答案。

回答

0

確定'沒有,找到我的答案。 開始使用代碼Matcher.appendReplacement

純Java:

Pattern p = Pattern.compile("\\[{2}((?:.)*?)\\]{2}"); 
Matcher m = p.matcher(content.asString()); 
StringBuffer sb = new StringBuffer(); 
while (m.find()) { 
    String one = m.group(1); 
    try { 
     m.appendReplacement(sb, "<a href=\"#!p\\:"+URLEncoder.encode(one,"UTF-8")+"\">$1</a>"); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
m.appendTail(sb); 

GWT:

RegExp p = RegExp.compile("\\[{2}((?:.)*?)\\]{2}", "g"); 
MatchResult m; 
StringBuffer sb = new StringBuffer(); 
int beginIndex = 0; 
while ((m = p.exec(content.asString())) != null) { 
    String one = m.getGroup(1); 
    int endIndex = m.getIndex(); 

    sb.append(content.asString().substring(beginIndex, endIndex)); 

    sb.append("<a href=\"#!p:" + URL.encode(one) + "\">" + one + "</a>"); 

    beginIndex = p.getLastIndex(); 
} 

sb.append(content.asString().substring(beginIndex)); 
+0

我實際上必須使用com.google.gwt.http.client.URL因爲我在gwt客戶端,但URLEncoder是大多數人會使用的,所以我將保持現狀。 –

0

替換你想先什麼都使用特殊字符,
則匹配的雙[內部和<a href=..>標籤取代。

那麼,或者將[中的url部分提取出來,並在將其放入<a href=..>標記中之前將其通過URL encoder

Java默認情況下似乎會提供java.net.URLEncoder。所以我認爲從模式中獲取,然後通過編碼器,然後將其放置在<a href=..>標籤中是您的最佳選擇。

+0

是的,我絕對不希望重塑URLEncoder的。 –

+0

是的:P很高興你找到了解決方案;) – c00kiemon5ter