譬喻,有字符串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()两个要领的利用更清楚呢,假如照旧不太必定最好本身动手写几行代码测试一下。
★group()/group(int group)/groupCount():
该系列要领与我们在上篇先容的Jakarta-ORO中的MatchResult .group()要领雷同(有关Jakarta-ORO请参考上篇的内容),都是要返回与组匹配的子串内容,下面代码将很好表明其用法:
import java.util.regex.*; public class GroupTest{ public static void main(String[] args) throws Exception { Pattern p = Pattern.compile("(ca)(t)"); Matcher m = p.matcher("one cat,two cats in the yard"); StringBuffer sb = new StringBuffer(); boolean result = m.find(); System.out.println("该次查找得到匹配组的数量为:"+m.groupCount()); for(int i=1;i<=m.groupCount();i++){ System.out.println("第"+i+"组的子串内容为: "+m.group(i)); } } }
输出为:
该次查找得到匹配组的数量为:2
第1组的子串内容为:ca
第2组的子串内容为:t
Matcher工具的其他要领因较量好领略且由于篇幅有限,请读者本身编程验证。
4.一个检讨Email地点的小措施:
最后我们来看一个检讨Email地点的例程,该措施是用来检讨一个输入的EMAIL地点里所包括的字符是否正当,固然这不是一个完整的EMAIL地点检讨措施,它不能检讨所有大概呈现的环境,但在须要时您可以在其基本上增加所需成果。
import java.util.regex.*; public class Email { public static void main(String[] args) throws Exception { String input = args[0]; //检测输入的EMAIL地点是否以 犯科标记"."或"@"作为起始字符 Pattern p = Pattern.compile("^//.|^//@"); Matcher m = p.matcher(input); if (m.find()){ System.err.println("EMAIL地点不能以'.'或'@'作为起始字符"); } //检测是否以"www."为起始 p = Pattern.compile("^www//."); m = p.matcher(input); if (m.find()) { System.out.println("EMAIL地点不能以'www.'起始"); } //检测是否包括犯科字符 p = Pattern.compile("[^A-Za-z0-9//.//@_//-~#]+"); m = p.matcher(input); StringBuffer sb = new StringBuffer(); boolean result = m.find(); boolean deletedIllegalChars = false; while(result) { //假如找到了犯科字符那么就设下标志 deletedIllegalChars = true; //假如内里包括犯科字符如冒号双引号等,那么就把他们消去,加到SB内里 m.appendReplacement(sb, ""); result = m.find(); } m.appendTail(sb); input = sb.toString(); if (deletedIllegalChars) { System.out.println("输入的EMAIL地点里包括有冒号、逗号等犯科字符,请修改"); System.out.println("您此刻的输入为: "+args[0]); System.out.println("修改后正当的地点应雷同: "+input); } } }
譬喻,我们在呼吁行输入:java Email @163.net
那么输出功效将会是:EMAIL地点不能以'www.'起始
假如输入的EMAIL为@kevin@163.net
则输出为:EMAIL地点不能以'.'或'@'作为起始字符
当输入为:cgjmail#$%@163.net
那么输出就是:
输入的EMAIL地点里包括有冒号、逗号等犯科字符,请修改
您此刻的输入为: cgjmail#$%@163.net
修改后正当的地点应雷同: cgjmail@163.net