我有一个小类,可以对字符串进行多次替换:
问题在于第二个替换操作中,有一个括号导致了以下异常:
“Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 8 (:)|:asd:)”
我该如何转义括号呢?或者,你能否建议一种替代方案来进行多重替换?非常感谢您,对我的英语表示歉意 :)
编辑:
用反斜杠“\”转义括号也行不通,它无法编译:
“Invalid escape sequence (valid ones are \b \t \n \f \r \" \' \ )”
新的编辑:
用两个反斜杠“\\”编译,但不能进行替换。
最后一个编辑:
终于找到了解决办法,在构建模式时使用Pattern.quote。必须使用迭代器来执行循环。
以下是正确的代码:
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<String,String> tokens = new HashMap<String,String>();
tokens.put(":asd:", "<img src=asd.gif>");
tokens.put(":)", "<img src=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());
}
}
问题在于第二个替换操作中,有一个括号导致了以下异常:
“Exception in thread "main" java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 8 (:)|:asd:)”
我该如何转义括号呢?或者,你能否建议一种替代方案来进行多重替换?非常感谢您,对我的英语表示歉意 :)
编辑:
用反斜杠“\”转义括号也行不通,它无法编译:
“Invalid escape sequence (valid ones are \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<String,String> tokens = new HashMap<String,String>();
tokens.put(":asd:", "<img src=asd.gif>");
tokens.put(":)", "<img src=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());
}
}
如果我可以改进工作,请您发表评论!非常感谢!
tokens.put(Pattern.quote(original), replacement)
。顺便说一下,你不需要分组,可以使用matcher.group(0)
。 - maaartinusPattern.quote
时,无需也不应该转义括号。因此,这是另一种解决方案。 - maaartinus