【精通正则表达式】--初学正则表达式

来源:互联网 发布:mysql分页语句 编辑:程序博客网 时间:2024/06/09 15:50

师兄要求写一个爬虫的程序,需要用到正则表达式,于是这几天看了下正则表达式的知识,不看不知道原来正则表达式可以这么强大。下面把这几天学习的东西总结一些,写成blog顺带复习一边巩固加深自己的理解。

一、什么是正则表达式

简单的说正则表达式就是由一些符号组成,用于对字符串进行操作。操作主要有匹配、切割、替换、获取四种。就像我们经常使用到的通配符? * 一样。


二、正则表达式的匹配使用方法

正则表达式的匹配作用需要和String类中的matches()方法配合使用。matches()方法的原型如下:

boolean matches(String regex),其中的regex就是正则表达式,返回值是boolean型,如果字符能和传入的正则表达式regex相匹配则返回true,否则返回false。

举个例子,我们要去验证一个网页中用户输入的手机号是否正确的时候就可以使用该知识点,我们知道手机号码都是11位数,其中第一位是1,那么我们可以使用1\d{10}这个正则表达式来进行匹配,其中\d是一个元字符,代表的是数字(0到9)而使用{}则表示前面的\d重复的次数,次数由括号中的数字表示。在这个正则表达式中\d重复的次数为10次。如果我们要表达重复4次以上,则要写成{4,}如果是4次到6次之间则写成{4.6}。

//演示匹配public static void Regex_1()throws IOException{//规则:假设要去匹配手机号码是否正确BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));String str = buffer.readLine();String regex = "1\\d{10}";  //不能把\\d写成\dif(str.matches(regex))System.out.println("Correct!");elseSystem.out.println("Erroe!");}
其中要注意的是由于正则表达式写在双引号“”中,需要转义符进行转义,所以在上面的代码中可以看到\d写成了\\d。


三、正则表达式的切割使用方法

正则表达式的切割作用需要和String类中的split()方法配合使用。split()方法的原型如下:

String[] split(String regex)其中regex也是正则表达式,该方法返回的是字符串数组String[],即切割后的字符串。

举个例子我们将字符串zhangsanttttttlisimmmmmmmwangwu中按照叠词切分开,则可以使用(.)\\1+这个正则表达式来匹配,在这个正则表达式中点.是元字符,表示的是匹配任意一个字符,其中小括号()是进行分组用的,在正则表达式中,分组之后会有自动编号,编号从1开始,如果要使用分组中的内容则用\num来使用编号为num的分组内容。+也是一个元字符,表示的是前面的字符重复一次或者多次,?则表示前面的字符重复0次或者1次,*则表示前面的字符重复0次或者多次。这个表达式表示的意思是(.)分组中的内容重复一次或者多次,也可以写成(.)\\1{2,}

//演示切割public static void Regex_2(){String str = "zhangsanttttttlisimmmmmmmwangwu";String regex = "\\s*";String[] names = str.split("(.)\\1+"); //用小括号进行分组并且系统会自动进行编号从1开始,使用编号\\num//对于复杂组((A)(B(C))) 从左到右数左边括号,这个中有四个组分别是((A)(B(C))) 、(A)、(B(C))、(C)  for(String name: names){System.out.println(name);}System.out.println(names.length);}
运行结果是:

zhangsan

lisi

wangwu

3


四、正则表达式的替换作用

正则表达式的替换作用更需要和String类中的replaceAll()方法或者replaceFirst()方法配合使用个,replaceAll()方法是替换所有符合的部分,而replaceFirst()方法则是替换符合的第一部分。两个方法的原型分别如下:

String replaceAll(String regex,String replacement),其中regex是正则表达式,使用给定的 replacement 替换此字符串所有匹配给定的正则表达式子字符串。

String replaceFirst(String regex,String replacement)和replaceAll()方法大同小异。

举个例子,我们要将字符串zhangsanttttttlisimmmmmmmwangwu中的叠词部分替换成#:

String str = "zhangsanttttttlisimmmmmmmwangwu";System.out.println(str.replaceFirst("(.)\\1+","#")); //用#替换第一个符合regex的子字符串System.out.println(str.replaceAll("(.)\\1+","#"));   //用#替换符合regex的子字符串

运行结果是:

zhangsan#lisimmmmmmmwangwu

zhangsan#lisi#wangwu


如果我们要使用叠词t或者m来替换叠词的全部部分,即结果为zhangsantlisimwangwu:

System.out.println(str.replaceAll("(.)\\1+","$1"));//$1获取第一个分组中的内容
我们可以看到第二个参数为$1,表示的是使用第一个分组中的内容。这个要和\num区分开,$num使用的情况是在另外一个引号中,而\num则是在同个引号内使用。


五、正则表达式的获取作用

正则表达式的获取需要使用Pattern类,先将正则表达式封装成对象,在创建匹配器,在使用匹配器对字符串进行操作。典型的调用顺序是:

Pattern p = Pattern.compile("regex"); //首先是正则表达式regex进行封装成对象。Pattern是一个类,compile()方法的原型为:public static Pattern compile(String regex)

Matcher m = p.matcher("str'); //创建匹配器,同时将要操作的字符串str输入到匹配器中。matcher()方法的原型为:public Matcher matcher(CharSequence input)

boolean b = m.matches();//使用匹配器对字符串进行操作,这里匹配器调用matches()方法对字符串进行判断,看是否符合正则表达式regex

举个例子,我们要将字符串da jia hao wo shi zeng wei quan qing wen ni shi shui nei中所有由三个字母组成的单词提取出来。可以使用\b\w{3}\b这一正则表达式来匹配,其中\b是元字符,指的是边界。

//演示获取public static void functionDemo_4(){String str = "da jia hao wo shi zeng wei quan qing wen ni shi shui nei";String regex = "\\b\\w{3}\\b";  //或者写成[a-z]{3}\\b//将正则表达式封装成对象Pattern p = Pattern.compile(regex);//通过正则对象获取匹配器对象,将字符串和正则表达式进行相关联Matcher m = p.matcher(str);//通过Matcher对象的方法对字符串进行操作while(m.find())//匹配之前要先找{System.out.println(m.group());//获取匹配的子序列System.out.println(m.start() + ":" + m.end());}}}
上面代码中涉及到两个函数,其中一个是find()另外一个是group(),两个函数都是匹配器的函数,原型分别如下:

public boolean find()查找与该模式(正则表达式)匹配的输入序列的下一个子序列

public String group() 返回匹配的子序列


上面的四种方法是这几天学到的应用,其实正则表达式很强大还有很多知识点没有涉及到,但是对于我要写一个爬虫程序上面的知识点基本能搞定了,下面附上获取网页邮箱的代码。

public static List<String> getMailsByWeb()throws IOException{//1.读取源文件URL url = new URL("http://www.scholat.com/~ytang");BufferedReader buffer = new BufferedReader(new InputStreamReader(url.openStream()));//2.对读取的数据进行规则的匹配,从中获取符合规则的数据String mail_regex = "\\w+@\\w+(\\.\\w+)+";List<String> list = new ArrayList<String>();Pattern p = Pattern.compile(mail_regex);String line = null;while((line = buffer.readLine()) != null){Matcher m = p.matcher(line);while(m.find()){list.add(m.group());}}//3.将符合规则的数据存储到集合中return list;}


附上这几天看过资料中觉得不错的一个网址

http://www.jb51.net/tools/zhengze.html#mission


0 0
原创粉丝点击