java转义括号_java转义括号

我有这个小类来对字符串进行多重替换:

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:", "asd.gif");

tokens.put(":)", "sorriso.gif");

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:", "asd.gif");

tokens.put(":)", "sorriso.gif");

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

}

}如果我能改进工作,请评论它!非常感谢你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值