2011-09-03 87 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

相关问题