通过Matcher类的find()和group()方法可以从目标字符串中依次提取出特定的字符串(匹配正则表达式的字串),例如互联网的网络爬虫,他们可以自动从网络网页识别出所有的电话号码。下面程序师范了如何从大字段中找出电话号码。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FinedGroup {
public static void main(String[] args){
//使用字符串模拟从网络上得到的网页源码
String str="我想求购一本《疯狂Java讲义》,尽快联系我13500006666"+"求交朋友,电话号码是13611125565"+"出售二手电脑,联系方式15899903312";
//创建一个pattern对象,并用它建立一个Matcher对象
//该正则表达式只抓取13X和15X字段的手机号
//实际要抓取那些电话号码,只要修正正则表达式即可
Matcher m=Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);
//将所有符合正则表达式的字串(电话号码)全部输出
while(m.find()){
System.out.println(m.group());
}
}
}
从上面运行结果可以看出,find()方法一次查找字符串中与Pattern相匹配的字串,一旦找到了对应的子串,下次调用find()方法时将接着向下寻找。
通过程序可以看出,使用正则表达式可以提取网页上的电话号码,也可以提取邮件地址等信息。如果程序再进一步,可以从网页上提取超链接的信息,再根据超链接打开其他网页,然后在其他网页上重复这个过程就可以实现简单的网络爬虫了。
通过上面的学习我们可以总结出正则表达式的特点和好处,此处总结了几点学习正则表达式之后自己的总结经验。大家可以通过观看传智博客毕向东视频来做出相应的对照。
正则表达式的:符合一定规则的表达式
作用:用于专门操作字符串
特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。
所以学习正则表达式就是在学习一些特殊符号的使用
好处:可以简化对字符串的复杂性
弊端:符号定义越多,正则越长,阅读性越差
具体操作的功能
1.匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2.切割:String split()
3.替换:String replaceALL()
4.获取:将字符串中符合规则的字串取出。
正则表达式的数量限制
就是的三种数量模式
1.匹配:
public class Mate {
public static void main(String[] args){
checkQQ();
}
public static void checkQQ(){
String qq="123453";
String regex="[1-9][0-9]{4,14}";
boolean b=qq.matches(regex);
if(b){
System.out.println(qq+"...is ok!");
}else{
System.out.println(qq+"... is not ok");
}
}
}
2.切割:
public class Cutting {
public static void main(String[] args){
splitDemo("erkktyqqquizzzzzzo","(.)\\1+");//按照叠词完成切割,为了可以让规则结果被重用
//可以将规则封装成一个组,用()完成,组的出现都有编号
//从1开始想要使用已有的组可以通过 \n(n为组的编号)的形式来获取
}
public static void splitDemo(String str,String reg){
String[] arr=str.split(reg);
System.out.println(arr.length);
for(String s:arr){
System.out.println(s);
}
}
}
3.替换
public class Replace {
public static void main(String[] args){
String str="wer12312423400000ty4124235235uiod512515f";
replaceAllDemo(str,"\\d{5,}","#");
String str1="erkktyqqquizzzzo";
replaceAllDemo(str1,"(.)\\1","$1");
}
public static void replaceAllDemo(String str,String reg,String newStr){
str=str.replaceAll(reg, newStr);
System.out.println(str);
}
}
4.获取:
/*
* 操作步骤:
* 1.将正则表达式封装成对象
* 2.让正则对象和要操作的字符串相关联
* 3.关联后,获取正则匹配引擎
* 4.通过引擎对符合规则的字串进行操作,比如取出
* */
public class RegexDemo2 {
public static void main(String[] args){
System.out.println();
getDemo();
}
public static void getDemo(){
String str="ming tain jiu yao fang jia le, da jia";
//str="1124124";
//String reg="[1-9]\\d{4,14}";
String reg="\\b[a-z]{4}\\b";
//将规则封装成对象
Pattern p=Pattern.compile(reg);
//让正则对象和要作用的字符串关联,获取匹配器对象
Matcher m=p.matcher(str);
//System.out.println(m.matches());//其实String类中的mathes方法,用的就是Pattern和Macher对象的来完成对类的
//只不过被String的方法封装后的,用起来较为简单,但是功能单一
//上个步骤已经传入matches方法中值
/*boolean b=m.find();//将规则作用到字符串上,并进行符合规则的查找
System.out.println(b);
System.out.println(m.group());//获取String没有进行封装后的*/
//group适用于获取匹配后的结果,首先需要进行先匹配
//类似于迭代器
//System.out.println(m.matches());
while(m.find()){
System.out.println(m.group());
System.out.println(m.start()+1+"……"+m.end());
}
}
}