JAVA正则Pattern和Matcher及replaceAll

来源:互联网 发布:python r语言 编辑:程序博客网 时间:2024/06/05 20:54

参考url:http://www.cnblogs.com/playing/archive/2011/03/15/1984943.html

1.简介: 

java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 
它包括两个类:Pattern和Matcher 。

Pattern: 一个Pattern是一个正则表达式经编译后的表现模式。 

Matcher: 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。

2.Pattern类: 

static Pattern compile(String regex) 
  将给定的正则表达式编译并赋予给Pattern类 

3.Matcher类: 

boolean matches() 
  尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值。 

boolean find(int start) 
  重设Matcher对象,并且尝试在目标字符串里从指定的位置开始查找下一个匹配的子串。 

String replaceAll(String replacement) 
  将目标字符串里与既有模式相匹配的子串全部替换为指定的字符串。 
String replaceFirst(String replacement) 
  将目标字符串里第一个与既有模式相匹配的子串替换为指定的字符串。 

Matcher类同时提供了四个将匹配子串替换成指定字符串的方法: 
replaceAll() 
replaceFirst() 
appendReplacement() 
appendTail() 
replaceAll()与replaceFirst()的用法都比较简单,请看上面方法的解释。我们主要重点了解一下appendReplacement()和appendTail()方法。 
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。 

还是有点模糊?那么我们来看个简单的程序: 
//该例将把句子里的"Kelvin"改为"Kevin" 
import java.util.regex.*; 
public class MatcherTest{ 
public static void main(String[] args) throws Exception { 
//生成Pattern对象并且编译一个简单的正则表达式"Kelvin" 
Pattern p = Pattern.compile("Kevin"); 
//用Pattern类的matcher()方法生成一个Matcher对象 
Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company"); 
StringBuffer sb = new StringBuffer(); 
int i=0; 
//使用find()方法查找第一个匹配的对象 
boolean result = m.find(); 
//使用循环将句子里所有的kelvin找出并替换再将内容加到sb里 
while(result) { 
i++; 
m.appendReplacement(sb, "Kevin"); 
System.out.println("第"+i+"次匹配后sb的内容是:"+sb); 
//继续查找下一个匹配对象 
result = m.find(); 

//最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里; 
m.appendTail(sb); 
System.out.println("调用m.appendTail(sb)后sb的最终内容是:"+ sb.toString()); 


最终输出结果为: 
第1次匹配后sb的内容是:Kevin 
第2次匹配后sb的内容是:Kevin Li and Kevin 
第3次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin 
第4次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin 
调用m.appendTail(sb)后sb的最终内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company. 
看了上面这个例程是否对appendReplacement(),appendTail()两个方法的使用更清楚呢,如果还是不太肯定最好自己动手写几行代码测试一下。 

------------------------------------------------------------------------分割线---------------------------------------------------------------------------

例2:

String Msg="";

ArrayList<String> params =[11, 22];

String msg_temp =“{1}为您的登录验证码,小心保管,请于{2}分钟内填写。如非本人操作,请忽略本短信 。”;

Pattern p = Pattern.compile("[{](.*?)[}]");
Matcher m = p.matcher(msg_temp);
ArrayList<String> strs = new ArrayList<String>();
while (m.find()) {
strs.add(m.group(1));
}
int i = 0;
for (String s : strs) {
msg_temp = msg_temp.replace("{" + s + "}", params.get(i));
i++;
}

Msg = msg_temp;

System.out.println(Msg);


最终输出结果为: 

11为您的登录验证码,小心保管,请于22分钟内填写。如非本人操作,请忽略本短信 。


------------------------------------------------------------------------分割线---------------------------------------------------------------------------

    System.out.println("abac".replace("a", "\\a"));     //   \ab\ac    System.out.println("abac".replaceAll("a", "\\a"));  //   abac    System.out.println("abac".replaceAll("a", "\\\\a"));//   \ab\ac    System.out.println("abac".replaceFirst("a", "\\a"));//   abac      System.out.println("abac".replaceAll("a(\\w)", "$1$1")); //    bbcc

replaceAll要求第一个参数是正则表达式,"a"既能理解成字符串a,也可以理解成正则表达式a

java中\需要转义\\,反斜线在第二个参数中也有特殊含义(正则转义),就必须再转义一次,用/a替换a时,必须写为\\\\a


0 0
原创粉丝点击