2011-09-03 154 views
2

我很努力使這個工作。Java:從一個字符串值中替換多個字符串模式

我有一個正則表達式爲:".*(${.*}).*"

和一個字符串變量myVar = "name = '${userName}'/pass = '${password}'"

我有一個存儲的值,在這種情況下,「$ {用戶名}」將有「張三的值是一個HashMap 「和」$ {密碼}「將具有」secretpwd「的值。

如何循環myVar中的所有找到的匹配(在本例中爲「userName」和「password」)? 然後,我可以循環找到的每個匹配,並從hashmap請求它們相應的值。

謝謝!

回答

3

您可以使用例如以下代碼:

Pattern p = Pattern.compile("\\$\\{.*?\\}"); 
while (true) { 
    Matcher m = p.matcher(myVar); 
    if (!m.find()) { 
     break; 
    } 
    String variable = m.group(); 
    String rep = hash.get(variable); 
    myVar = m.replaceFirst(rep); 
} 

請注意,我調整了正則表達式以適合您的要求。

+0

我只是試過,但它無休止地循環,任何想法爲什麼? – scal

+0

也許你的散列值包含一個看起來像'$ {...}'的值?我不能不知道你的輸入和你的散列內容。你可以包含一個調試輸出或者在最後一行放置一個斷點,並且每次查找'variable'和'rep'。 – Howard

+0

循環不斷返回相同的正則表達式匹配(userName),它不循環每次匹配。所以如果我有''用戶名='$ {userName}'和密碼= ='$ {密碼}'「'它循環和輸出(調試):'變量= $ {用戶名} 代表= John Doe'所以它是正確的但只是保持循環和輸出,並從來沒有$ {密碼}一個 – scal

0

有了這個字符串作爲正則表達式,你將有2組包含 「$ {}用戶」 和 「$ {}密碼」:

".*(\\$\\{.*}).*(\\$\\{.*}).*" 

要通過組迭代:

// Compile and use regular expression 
Pattern pattern = Pattern.compile(patternStr); 
Matcher matcher = pattern.matcher(inputStr); 
boolean matchFound = matcher.find(); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i=0; i<=matcher.groupCount(); i++) { 
     String groupStr = matcher.group(i); 
    } 
} 

來源:http://www.exampledepot.com/egs/java.util.regex/Group.html

+0

該字符串可以包含0到n個變量,因此reg exp不符合我的要求。將檢查鏈接尋求幫助。謝謝 – scal