我有这个小类来对字符串进行多重替换:
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
public class MultipleReplace {
public static void main(String[] args) {
Map tokens = new HashMap();
tokens.put(":asd:", "");
tokens.put(":)", "");
String template = ":asd: bravo! :)";
String patternString = "(" + StringUtils.join(tokens.keySet(), "|") + ")";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
}
}问题在于第二次替换,我有一个括号导致:
线程“main”中的异常java.util.regex.PatternSyntaxException:在索引8附近关闭''''不匹配
(:)|:ASD :)
我怎样才能摆脱括号?
或者,你可以建议一个替代方案来做这个多重替换吗?
非常感谢,对我的英文感到抱歉:)
编辑:
用反斜杠转义')'不起作用,它不会编译:
“无效的转义序列(有效的转义序列是\ b \ t \ n \ f \ r \”\'\)“
新编辑
使用两个反斜杠编译,但不做替换。
最后编辑
最后找到了解决方案,在构建模式时使用Pattern.quote。必须使用迭代器来完成循环。
这里是正确的代码:
package string;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MultipleReplace {
@SuppressWarnings("rawtypes")
public static void main(String[] args) {
Map tokens = new HashMap();
tokens.put(":asd:", "");
tokens.put(":)", "");
String template = ":asd: bravo! :)";
Iterator it = tokens.entrySet().iterator();
String patternString = "(";
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry)it.next();
System.out.println(pairs.getKey() + " = " + pairs.getValue());
patternString = patternString +Pattern.quote((String) pairs.getKey());
if (it.hasNext())
{
patternString = patternString + "|";
}
}
patternString = patternString + ")";
System.out.println(patternString);
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(template);
StringBuffer sb = new StringBuffer();
while(matcher.find()) {
matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
}
}如果我能改进工作,请评论它!非常感谢你!