我有一个输入字符串:
"hello [you], this is [me]"
我有一个将字符串映射到字符串的函数(为简单起见,硬编码):
public String map(final String input) {
if ("you".equals(input)) {
return "SO";
} else if ("me".equals(input)) {
return "Kate";
}
...
}
通过各自的映射(通过调用[(.*)?]
函数给出)替换每个map
事件的最方便的方法是什么?
如果我是正确的,你不能在这里使用String.replaceAll()
,因为我们事先不知道更换。
答案 0 :(得分:1)
首先,你拥有的表达是贪婪的。与方括号中的标记匹配的正确表达式是\[([^\]]*)\]
(反斜杠需要加倍为Java),因为它避免超过结束方括号 * 。我添加了一个捕获组来访问方括号内的内容group(1)
。
这是一种做你需要的方法:
Pattern p = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = p.matcher(input);
StringBuffer bufStr = new StringBuffer();
boolean flag = false;
while ((flag = m.find())) {
String toReplace = m.group(1);
m.appendReplacement(bufStr, map(toReplace));
}
m.appendTail(bufStr);
String result = bufStr.toString();
* 您也可以使用[.*?]
,但这种不情愿的表达可能会导致回溯。
答案 1 :(得分:0)
您可以执行以下操作:
String line = "hello [you], this is [me]";
Pattern p = Pattern.compile("\\[(.*?)\\]");
Matcher m = p.matcher(line);
while (m.find()) {
// m.group(1) contains the text inside []
// line.replace(m.group(1), yourMap.get(m.group(1)));
// use StringBuilder to build the new string
}