2015-08-24 25 views
0

難以淨化字符串以允許$和/保留在字符串中。 (即想接受姓名/電子郵件以保持美元符號)。爲此,我試圖使用Pattern類,並試圖找到將Pattern方法放在公共字符串cutomiseText中的最佳解決方案。

public String customiseText(String bodyText, List<Object> objectList) { 
    Map<String, String> replaceKeyMap = extractMapFromList(objectList); 

    // iterate over the mapkey and return the body text replace 
    for (final String key : replaceKeyMap.keySet()) { 
     String replacementKey = "(?i)" + key; 
     String replacementValue = replaceKeyMap.get(key); 
     if (replacementValue == null) { 
      replacementValue = ""; 
     } 
     bodyText = bodyText.replaceAll(replacementKey, replacementValue); 
    } 

    return bodyText; 
} 

//代碼不工作:

//的作品原始代碼

import java.util.regex.Pattern; 

public String customiseText(String bodyText, List<Object> objectList) { 
    Map<String, String> replaceKeyMap = extractMapFromList(objectList); 
    String escapedString = Pattern.quote(bodyText); // 
    // iterate over the mapkey and return the body text replace 
    for (final String key : replaceKeyMap.keySet()) { 
     String replacementKey = "(?i)" + key; // not case sensitive and empty string matcher 
     String replacementValue = replaceKeyMap.get(key); 
     if (replacementValue == null) { 
      replacementValue = ""; 
     } 
     escapedString = escapedString.replaceAll(replacementKey, replacementValue); 
    } 

    return escapedString; 
} 
+1

不知道,你應該把什麼? – Ivan

+0

在'bodyText'上調用'Pattern.quote'沒有任何意義。在'key'上調用會更有意義。 – Andreas

+0

由於您正在迭代鍵和值,因此使用'entrySet()'而不是'keySet()'。 – Andreas

回答

1

解決了與要回原來的代碼並添加一行消毒$ /:

// iterate over the mapkey and return the body text replace 
for (final String key : replaceKeyMap.keySet()) { 
    String replacementKey = "(?i)" + key; 
    String replacementValue = replaceKeyMap.get(key); 
    if (replacementValue == null) { 
     replacementValue = ""; 
    } 
    *replacementValue = replacementValue.replace("\\",  
     "\\\\").replace("$","\\$"); // sanitizes '$' and '\'* //only added this 
    bodyText = bodyText.replaceAll(replacementKey, replacementValue); 
} 

return bodyText; 

}

1

假設您的問題是,無論是keyvalue是純文本,而不是常規的expresssions,你必須逃避(又名「報價」)他們。

注意:已更改的代碼使用entrySet

public String customiseText(String bodyText, List<Object> objectList) { 
    Map<String, String> replaceKeyMap = extractMapFromList(objectList); 

    // iterate over the mapkey and return the body text replace 
    for (Entry<String, String> entry : replaceKeyMap.entrySet()) { 
     String key = "(?i)" + Pattern.quote(entry.getKey()); 
     String value = entry.getValue(); 
     value = (value != null ? Matcher.quoteReplacement(value) : ""); 
     bodyText = bodyText.replaceAll(key, value); 
    } 
    return bodyText; 
} 
+0

我有點困惑(因爲我是這個新手 - 我的道歉)。看起來我必須在這裏建立getKey()和getValue()方法。此外,我需要導入什麼類來允許Entry 被接受?此外,這個java文件與原始代碼一起工作正常 - 我認爲這將是一個更簡單的解決方案,只是爲了獲得美元作爲字符串簽名而沒有錯誤。這不可能嗎? – user5261902

+0

@ user5261902 Entry是'Map'的一個內部類。由於您已經導入了'Map',因此您可以將代碼更改爲'Map.Entry',並且不需要另一次導入。 'getKey()'和'getValue()'是'Entry'的方法,所以你不必建立它們。 – Andreas

+0

@ user5261902你是什麼意思「更容易」?你只是用'Pattern.quote'和'Matcher.quoteReplacement'來包裝密鑰。這很容易。 – Andreas