现在我们先来看一个简单的例子,再通过分析它来了解怎样生成一个Pattern对象并且编译一个正则表达式,最后根据这个正则表达式将目标字符串进行分割: import java.util.regex.*; public class Replacement{ public static void main(String[] args) throws Exception { // 生成一个Pattern,同时编译一个正则表达式 Pattern p = Pattern.compile("[/]+"); //用Pattern的split()方法把字符串按"/"分割 String[] result = p.split( "Kevin has seen《LEON》seveal times,because it is a good film." +"/ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部" +"好电影。/名词:凯文。"); for (int i=0; i<result.length; i++) System.out.println(result[i]); } }
输出结果为:
Kevin has seen《LEON》seveal times,because it is a good film. 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。 名词:凯文。
很明显,该程序将字符串按"/"进行了分段,我们以下再使用 split(CharSequence input, int limit)方法来指定分段的段数,程序改动为: tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。",2);
这里面的参数"2"表明将目标语句分为两段。
输出结果则为:
Kevin has seen《LEON》seveal times,because it is a good film. 凯文已经看过《这个杀手不太冷》几次了,因为它是一部好电影。/名词:凯文。
还是有点模糊?那么我们来看个简单的程序: //该例将把句子里的"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.
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); } } }