替换正则表达式出现

时间:2015-02-09 13:40:58

标签: java regex replace

我有一个输入字符串:

"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(),因为我们事先不知道更换。

2 个答案:

答案 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();

Demo.

* 您也可以使用[.*?],但这种不情愿的表达可能会导致回溯。

答案 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
}