我希望匹配正则表达式并修改匹配。这是我的功能。现在,我的方法根本不改变输入。怎么了?感谢。
Matcher abbrev_matcher = abbrev_p.matcher(buffer);
StringBuffer result = new StringBuffer();//must use stringbuffer here!
while (abbrev_matcher.find()){
//System.out.println("match found");
abbrev_matcher.appendReplacement(result, getReplacement(abbrev_matcher));
}
abbrev_matcher.appendTail(result);
private static String getReplacement(Matcher aMatcher){
StringBuilder temp = new StringBuilder(aMatcher.group(0));
for (int i = 0; i < temp.length(); i++){
if (temp.charAt(i) == '.'){
temp.deleteCharAt(i);
}
}
return temp.toString();
}
答案 0 :(得分:1)
您只想删除匹配文字中的所有点?这里:
StringBuffer result = new StringBuffer();
while (abbrev_matcher.find()) {
abbrev_matcher.appendReplacement(result, "");
result.append(abbrev_matcher.group().replaceAll("\\.", ""));
}
abbrev_matcher.appendTail(result);
appendReplacement(result, "")
的原因是appendReplacement
查找$1
,$2
等,因此它可以用捕获组替换它们。如果您没有将字符串文字或其他字符串常量传递给该方法,则最好避免该处理步骤并改为使用StringBuffer的append
方法。否则,如果替换字符串中有任何美元符号或反斜杠,它将会爆炸。
对于您的getReplacement
方法,在我的测试中, 会更改匹配的字符串,但它无法正确执行。例如,如果字符串为...blah...
,则返回.blah.
。这是因为,每次在StringBuilder上调用deletecharAt(i)
时,都会更改所有后续字符的索引。你必须向后遍历字符串以使该方法有效,但它不值得;只需从 empty StringBuilder开始,然后按append
构建字符串,而不是删除。它更有效,更易于管理。
现在我再考虑一下,你没有看到任何改变的原因可能是你的代码抛出了一个StringIndexOutOfBoundsException,你没有看到它,因为代码在try
块中运行相应的catch
块为空(经典Empty Catch Block反模式)。 N'est-ce pas?