您的位置:首页 > 编程语言 > Java开发

java 字符串替换处理方法

2014-08-02 15:42 190 查看
刚刚遇到一个问题,需要处理一个字符串,要求是把指定结构中的某些字符串替换掉。例如:

String str="确诊/v 30/m 例/q ,/wd 其中/rz 死亡/vi 5/f 例/n ,/wd 治愈/v 出院/vi 3/n 例/n ",这是个汉语言分词标注结果,现在我想要对该结果做一些修正,该标注结果中,像“30、5、3”这些数词标注的结果不一样,这不便于处理,因此需要统一起来。于是:

需求:将数字后面的"/英文字母"统一换成”数字/m“的形式。

这个看似简单的过程却困扰了本菜鸟一上午的时间,首先想到正则,匹配 数字 + / + 字母 组合,表达式很好写:[0-9]+ / [a-z]。可是匹配到之后我就不知道怎么处理了,我要保留之前的数字,只替换斜杠后面的字母。一开始我是先用num=matcher.group(1)获取前面的数字,然后替换后面的字母。

word = matcher.group(1);
str = str.replace("([0-9]+)/[a-z]*", word + "/m");

功能无法实现,replace函数只替换一个,replaceAll也没用,全部替换的话前面的数字不一样。

于是去搜了一下发现java中还有两个字符串替换函数:appendReplacement(StringBuffer sb,string replacement)和appendTail(StringBuffer sb)

appendReplacement(StringBuffer sb, String replacement)

将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个 StringBuffer 对象里,而 appendTail(StringBuffer sb) 方法则将最后一次匹配工作后剩余的字符串添加到一个 StringBuffer 对象里。

例如,有字符串 fatcatfatcatfat, 假设既有正则表达式模式为"cat",第一次匹配后调用 appendReplacement(sb,"dog"), 那么这时 StringBuffer sb 的内容为 fatdog,也就是 fatcat 中的 cat 被替换为 dog 并且与匹配子串前的内容加到 sb 里,而第二次匹配后调用 appendReplacement(sb,"dog"),那么 sb 的内容就变为 fatdogfatdog,如果最后再调用一次 appendTail(sb), 那么 sb
最终的内容将是 fatdogfatdogfat。

于是代码如下:

String word = null;
Pattern pattern = Pattern.compile("([0-9]+)/[a-z]+");
Matcher matcher = pattern.matcher(str);
StringBuffer sb=new StringBuffer();
while (matcher.find()) {
word = matcher.group(1);
matcher.appendReplacement(sb, word + "/m");
}
matcher.appendTail(sb);
return sb.toString();


处理结果:确诊/v 30/m 例/q ,/wd 其中/rz 死亡/vi 5/m 例/n ,/wd 治愈/v 出院/vi 3/m 例/n


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: