JAVA正则Pattern和Matcher及replaceAll

参考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    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

 

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matcher.replaceAll(String replacement)方法是用指定的替换字符串来替换输入字符串中所有匹配的子字符串,并返回替换后的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Matcher](https://blog.csdn.net/weixin_44792849/article/details/124352087)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [JAVA正则PatternMatcherreplaceAll](https://blog.csdn.net/q975583865/article/details/70074031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [通过Java正则表达式去掉SQL代码中回车换行和多余空格](https://download.csdn.net/download/weixin_38748721/14906111)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值