在工作中经常用到的查找替换方式是String的replace、replaceAll。不过配合使用Pattern、Matcher、StringBuffer可以实现更灵活的替换。代码如下,重点看一下“动态替换”。
import static org.junit.Assert.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.junit.Test;
/**
* java查找替换
*
* @author wei.ss
*
*/
public class JavaSearchReplace {
@Test
public void test() {
// String的替换方法
String content = "aaaaa";
// 替换第一个,第一个参数支持正则表达式
assertEquals("baaaa", content.replaceFirst("a", "b"));
assertEquals("baaaa", content.replaceFirst("[a-z]", "b")); // 正则表达式
// 按字符替换: 替换所有查找到的字符。显然第一个参数不支持正则表达式
assertEquals("bbbbb", content.replace('a', 'b'));
// 按字符串替换:替换所有查找到的字符串,第一个参数不支持正则表达式。
assertEquals("bbbbb", content.replace("a", "b"));
// 替换所有:和replace(String, String)方法不同的是,replaceAll第一个参数还支持正则表达式
assertEquals("bbbbb", content.replaceAll("a", "b"));
assertEquals("bbbbb", content.replaceAll("\\w", "b")); // 正则表达式
// 重点注意一下:动态替换。
// 需求是:将所有查找到的a字母依次替换为1,2,3,依次类推,最后的结果应该是"xxxxx1xx2345xx6yyy"
content = "xxxxxaxxaaaaxxayyy";
String expected = "xxxxx1xx2345xx6yyy"; // 期望的结果
StringBuffer sb = new StringBuffer();
Pattern p = Pattern.compile("a");
Matcher m = p.matcher(content);
int i = 1;
while (m.find()) {
m.appendReplacement(sb, i++ + "");
}
m.appendTail(sb); // 把字符串的尾部也附加上,不然"yyy"将会丢失。
// 验证结果
assertEquals(expected, sb.toString());
}
}