gpt4 book ai didi

java - 如何挽留。 java正则表达式中的点

转载 作者:行者123 更新时间:2023-11-30 10:50:16 25 4
gpt4 key购买 nike

我的程序如下,

    /**
* @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(.) 和 "\n" 应该保留,而不是用空格代替。我是 Java 8 版本,让我知道如何保留 dot(.) 和 "\n"

最佳答案

您有一个重复调用 matcher.find() 以查找字符串中的下一个匹配项的循环;然后调用 appendReplacement()appendReplacement 的 javadoc 说它是这样做的:

  1. 它从输入序列中读取字符,从附加位置开始,并将它们附加到给定的字符串缓冲区。它在读取上一个匹配项之前的最后一个字符后停止,即索引 start() - 1 处的字符。

  2. 它将给定的替换字符串附加到字符串缓冲区。

  3. 它将这个匹配器的附加位置设置为最后一个匹配字符的索引加一,即到 end()。

因此对于每个匹配项,它将字符附加到匹配项,然后附加替换字符串(而不是匹配的字符串)。到目前为止,一切都很好。

但是当没有更多匹配项时会发生什么?输入中仍有字符留在最后一个匹配项的右侧,但未附加到输出中。

幸运的是,有一种方法可以为您解决这个问题:appendTail .

关于java - 如何挽留。 java正则表达式中的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35147432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com