黑马程序员---正则表达式

------- Java、.NetAndroid培训期待与您交流!------- 

一、正则(Regex)概念

        正则表达式:符合一定规则的表达式。
        作用:用于专门操作字符串。
        特点:用于一些特定的符号来表示一些代码操作,这样就简化书写。
        所以学习正则表达式,就是在学习一些特殊符号的使用。

        好处:可以简化对字符串的复杂操作。
        弊端:符号定义越多,正则越长,阅读性越差。

二、具体操作功能

        对正则的功能定义都在Pattern类和Matcher类中,位于java.util.regex包中,正则中具体的特殊符号参阅Pattern类。

        下面是关于String类中涉及到正则的操作。

        1、匹配 boolean matches(String regex):用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
              如对QQ号码的校验:要求:号码段在5~11之间,不能以0开头,只能是数字。

            public static void checkQQ(String qq){
                  String regex = "[1-9]\\d{4,10}";//改正则含义:首位只能是1-9间的数字,后续4到10位为0-9之间的数字。
                  Boolean b = qq.matches(regex);
                  System.out.println(b);
             }

        2、切割 String[] split(String regex)
              对字符串str的切割:

            String str = "zhangsan.lisi.wangwu";
            String[] arr = str.split("\\.");
            for (String s : arr)
            System.out.println(s);

        注意:该处要使用字符 '.' 进行切割字符串,而 "." 在正则中表示任意字符,所以必须取出字符 '.' ,而非正则表达式中的"." , "\." 是将"." 转义了,所以要用 "\\" 来将转义符 \ 转义成字符 '\' ,"\\."这样取得的才是字符 '.'。

        3、替换 String replaceAll(String regex, String replacement)
                       String replaceFirst(String regex, String replacement) 
                       如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
              例子:将重叠出现的字符替换成单个相同的字符:zzzz—>z。

            String str = "weer13899800000ty11155588uiod222333s2222";
            str = str.replaceAll("(.)\\1+","$1"); 

        该例中出现了组的概念,后面将讲到。正则"(.)\\1+",( )是对组的封装描述,该正则表示任意一个字符重复出现一次或多次;"$1"表示第一组中的元素,该组中只有一个组存在,即任意满足重叠的字符。

        4、获取 将字符串中的符合规则的子串取出。(重点)操作步骤:
              (1) 将正则表达式封装成Pattern对象。
              (2) 让正则对象和要操作的字符串相关联。
              (3) 关联后,获取正则匹配引擎。
              (4) 通过引擎对符合规则的子串进行操作,比如取出。
              例子:

            String str = "jiang zi fu chuan zhong fu he zheng ze gui ze de zi chuan qu chu.";
            System.out.println(str);
            String reg = "\\b\\w{5}\\b";  // \b边界符
            //将规则封装成对象
            Pattern p = Pattern.compile(reg);
            //让正则对象和要作用的字符串相关联,获取匹配器。
            Matcher m = p.matcher(str);
            //System.out.println(m.matches());//其实String类中的matches方法,用的就是Pattern和Matcher对象来完成的。
                  只不过被String的方法封装后,用起来较为简单,但是功能却单一。m.matches()匹配的是整个字符串
            while (m.find()){
                  System.out.println(m.group()); //用于获取匹配后结果。
                  System.out.println(m.start()+"..."+m.end()); //获取符合内容的起始位置,含头不含尾
            }

三、示例

1、 需求:192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30,将ip地址进行地址段顺序的排序。

       思路: 按照字符串自然顺序排序,只要让它们每一段都是3位即可。
               (1)按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。
               (2)将每一段只保留3位。这样,所有的ip地址都是每一段3位。

       String ip = "192.68.1.254 102.49.23.013  10.10.10.10 2.2.2.2 8.109.90.30";
       ip = ip.replaceAll("(\\d{1,3})","00$1");  //所有段位前补0
       ip = ip.replaceAll("0*(\\d{3})","$1"); //去掉满足3位数后前面的所有的0
       String[] arr = ip.split(" +");

       Set<String> set = new TreeSet<String>();
       for (String s : arr)
              set.add(s); //存入集合底层会调用排序功能
       for (String s : set)
              System.out.println(s.replaceAll("0*(\\d+)","$1")); //去掉有效未前面所有的0,这步是还原操作。

2、网页爬虫(蜘蛛)

      需求:获取指定网页中的所有邮件地址。

import java.io.*;
import java.util.regex.*;
import java.net.*;

class  RegexTest2 
{
	public static void main(String[] args) throws Exception{
		getMails_1();
	}
	//获取指定网址中的邮件地址
	public static void getMails_1() throws Exception{
		//前提,需打开tomcat服务器,获取网址
		URL url = new URL("http://127.0.0.1:8080/myweb/mail.html");
		//打开连接
		URLConnection conn = url.openConnection();
		
		BufferedReader bufrIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		//将规则封装成对象
		Pattern p = Pattern.compile("\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}");

		String line = null;
		while ((line=bufrIn.readLine())!=null){
			//让正则对象和要作用的字符串相关联,获取匹配器。
			Matcher m = p.matcher(line);
			while (m.find())//将规则作用到字符串上,并进行符合邮件格式规则的邮件查找,找到返回ture。
			{
				System.out.println(m.group());	//打印匹配后结果
			}
		}
	}
	//获取文档中的邮件地址,使用获取功能:Pattern  Matcher
	public static void getMails()throws Exception{
		BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));
		String mailreg = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";
		//将规则封装成对象
		Pattern p = Pattern.compile(mailreg);

		String line = null;
		while ((line=bufr.readLine())!=null){
			//让正则对象和要作用的字符串相关联,获取匹配器。
			Matcher m = p.matcher(line);
			while (m.find())//将规则作用到字符串上,并进行符合邮件格式规则的邮件查找,找到返回ture。
				System.out.println(m.group());	//打印匹配后结果
		}
	}
}     

        总结:正则表达式的出现就是为了方便对字符串的处理,简化对字符串的操作。正则中有许多特殊意义的符号,并不需要记全这些特殊符号,一些常用的记住就OK。

        正则操作中获取匹配正则的子串最重要,需要掌握,这涉及到Pattern类和Matcher匹配器。首先需要将正则封装成Pattern对象;其次在关联需要匹配的字符串来获取匹配器,表达式为:被对象化的正则 . matcher("参与匹配的字符串");然后通过匹配器中的find()方法,将规则作用到字符串上,进行符合规则的子串查找,若找到返回true,若没有找到,(在匹配器没有被重置的情况下)接着该位置继续进行下一个子串的匹配;最后,通过group()方法获取通过find()匹配的子序列(可能为空,如模式 a*)。对于获取匹配子串可以结合IO流,将匹配结果输出到指定的目的设备中(如文件、控制台)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值