我的程序如下,
/**
* @param args
*/
public static void main(String[] args) {
RegularExpressions r = new RegularExpressions();
// TODO Auto-generated method stub
String []input = {" Dear [name],\n",
"\n",
"Thanks for buying the [num] [item].\n",
"We appreciate your patronage\n",
"\n",
"Best, [sales_person]\n"};
HashMap<String, String> dic = new HashMap<String, String>();
dic.put("name", "Anna Bell Smith");
dic.put("num", "eight");
dic.put("item", "Boxes of Soap.");
dic.put("sales_person", "Karmine Smithe");
String []afterChange = r.replace(input, dic);
r.display(afterChange);
}
String [] replace(String []strings, Map<String, String> dict){
String patternStr = ".(";
for(String key:dict.keySet()){
patternStr = patternStr + key + "|";
}
patternStr = patternStr.substring(0, patternStr.length()-1);
patternStr = patternStr+").";
Pattern pattern = Pattern.compile(patternStr);
for(int i=0;i<strings.length;i++){
StringBuffer sb = new StringBuffer();
Matcher matcher = pattern.matcher(strings[i]);
boolean isMatcherFind = false;
while(matcher.find()){
matcher.appendReplacement(sb, dict.get(matcher.group(1)));
isMatcherFind = true;
}
if(isMatcherFind){
strings[i] = sb.toString();
}else{
strings[i] = strings[i];
}
}
return strings;
}
void display(String []str){
for(String s:str){
System.out.println(s);
}
}
}
上述程序提供了类似
的输出Dear Anna Bell Smith
Thanks for buying the eight Boxes of SoapWe appreciate your patronage
Best, Karmine Smithe
虽然我期待输出为
Dear Anna Bell Smith
Thanks for buying the eight Boxes of Soap.
We appreciate your patronage
Best, Karmine Smithe.
意思是,dot(.) and "\n"
应保留,而不是用空格替换。我是java 8版本,让我知道如何保留dot(.) and "\n"
答案 0 :(得分:1)
你有一个循环,它反复调用matcher.find()
来查找字符串中的下一个匹配项;然后它调用appendReplacement()
。 appendReplacement
的javadoc表示它这样做:
它从输入序列中读取字符,从追加位置开始,并将它们附加到给定的字符串缓冲区。它在读取前一个匹配之前的最后一个字符后停止,即索引start() - 1处的字符。
它将给定的替换字符串附加到字符串缓冲区。
它将此匹配器的追加位置设置为匹配的最后一个字符的索引加上一个,即结束()。
因此,对于每个匹配,它会将字符追加到匹配项,然后附加替换字符串(而不是匹配的字符串)。到现在为止还挺好。
但是当没有更多匹配时会发生什么?在最后一场比赛的右侧,输入中仍然留有未附加到输出的字符。
幸运的是,有一种方法可以完全解决这个问题:appendTail
。
答案 1 :(得分:0)
您必须明确使用appendReplacement
和appendTail
。很遗憾,您必须使用StringBuffer
来执行此操作。这是一个片段:
String content="aaaaaaaaaa";
Pattern pattern = Pattern.compile("a");
Matcher m = pattern.matcher(content);
StringBuffer sb = new StringBuffer();
final int N = 3;
for (int i = 0; i < N; i++) {
if (m.find()) {
m.appendReplacement(sb, "b");
} else {
break;
}
}
m.appendTail(sb);
System.out.println(sb); // bbbaaaaaaa