zoukankan      html  css  js  c++  java
  • 黑马程序员--正则表达式

    ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------


    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。但是符号定义越多,正则表达式就会越长,阅读性就会越差。


    正则表达式的构造摘要:

         (1)字符类

       [abc]          a、b或 c(简单类)

       [^abc]         任何字符,除了 a、b或 c(否定)

       [a-zA-Z]       Z,两头的字母包括在内(范围)

       [a-d[m-p]]     p:[a-dm-p](并集)

       [a-z&&[def]]   d、e或 f(交集)

       [a-z&&[^bc]]   z,除了c:[ad-z](减去)

       [a-z&&[^m-p]]  z,而非p:[a-lq-z](减去)

      (2)预定义字符类

        .       任何字符(与行结束符可能匹配也可能不匹配)

        d      数字:[0-9]

        D      非数字: [^0-9]

        s      空白字符:[ x0Bf ]

        S      非空白字符:[^s]

        w      单词字符:[a-zA-Z_0-9]

        W      非单词字符:[^w]

       注意:因为这些都是转义字符,在操作字符串是前面要多加一个""。如将字符串str按"."切割。

         String str = "apple.banana.orange.mango";

         String reg = "\.";

         String[] arr = str.split(reg);

    (3)边界匹配器

    ^      行的开头

    $      行的结尾

         单词边界

    B     非单词边界

    A     输入的开头

    G     上一个匹配的结尾

         输入的结尾,仅用于最后的结束符(如果有的话)

    z     输入的结尾

      (4)Greedy 数量词

        X?       X,一次或一次也没有

        X*       X,零次或多次

        X+       X,一次或多次

        X{n}     X,恰好 

        X{n,}    X,至少 

        X{n,m}   X,至少 次,但是不超过

      (5)组

        当我们想要让一个规则的结果被重用时,可以将这个规则封装成一个组,用()来完成。每个组都有自己的编号,从1开始。想要使用已有的组,可以通过 (n表示组的编号)的形式获取。如对一个字符串按叠词进行分割。

        String str = "bghhdcajjf";

        String reg = "(.)\1";

        String[] arr=str.split(reg);


         正则表达式的具体操作功能:

       (1)匹配

         用String类中的matches方法。

        boolean matches(String regex);告知此字符串是否匹配给定的正则表达式,如果匹配返回true,如果有一次不匹配,则返回false。如匹配一个qq号(5-15)位,开头不能为0

        String qq = "1234567";

        System.out.println(qq.matches("[1-9][0-9]{4,14}"));//结果为true。

    String qq1 = "1234a67";

    System.out.println(qq.matches("[1-9][0-9]{4,14}"));//结果为false。

    (2)切割

    用String类中的split方法。

    String[] split(String regex);根据给定正则表达式的匹配拆分此字符串。如将字符串按照"\"切割

    String str = "d:\123\abc";

    String reg = "\\"; //在字符串中一个要用转义"\"表示

    String[] arr=str.split(reg);

    (3)替换

    用String类中的replaceAll方法

    String replaceAll(String regex,String replacement); 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。如将字符串中的重叠字符换成单个字符

    String str = "abccdefffklhhhh";

    String reg = "(.)\1+";  //"+"表示不止两个字符重叠

    str = str.replaceAll(reg,"$1");

    注:$n用来获取前面规则中的组,n表示组号。

    (4)获取

    就是将字符串中符合规则的子串取出。

    操作步骤:

    a.将正则表达式封装成对象

    b.让正则对象和要操作的字符串相关联

    c.关联后,获取正则匹配引擎

    d.通过引擎对符合规则的子串进行操作。

    如将字符串中由3个字符组成的子串取出。

    import java.util.regex.*;
    class RegexDemo 
    {
       public static void main(String[] args) 
       {
    		String str = "da jia hao,huan ying lai dao hei ma!";
    		String reg = "\b[a-z]{3}\b";  
    
    		//将规则封装成对象
    		Pattern p = Pattern.compile(reg);
    
    		//让正则对象和要作用的字符串相关联。获取匹配器对象。
    		Matcher m = p.matcher(str);
    
    		while(m.find())  //将规则作用到字符串上,并进行符合规则的子串查找。
    		{
    			 System.out.println(m.group());//作用于匹配后结果。
    		}
        }
    }
    



    在操作字符串时,这四种功能应该如何选择呢?如下

    (1)如果只想知道该字符串是对是错,就要使用匹配。

    (2)如果想要将已有字符串变成另一个字符串,就要使用替换。

    (3)如果想要按照自定义方式将字符串变成多个字符串,就要使用切割。(获取符合规则以外的子串)

    (4)如果想要拿到符合要求的字符子串,就要使用获取。(获取符合规则的子串)


    应用实例:

    (1)获取某一指定文件中的邮箱地址

    import java.net.*;
    import java.io.*;
    import java.util.regex.*;
    class RegexText 
    {
    	public static void main(String[] args) throws Exception
    	{
    		 getMails();
    		 getMails_1();
    	}
    
        //网页爬虫
    
        public static void getMails_1()throws Exception
        {
    		URL url = new URL("http://169.254.246.232:8080/myweb/mail.html");
    		URLConnection conn = url.openConnection();
    
    
    		BufferedReader bufIn = 
    
    			 new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
    		String line = null;
    		String mailreg = "\w+@\w+(\.\w+)+";
    		Pattern p = Pattern.compile(mailreg);
    
    		while((line=bufIn.readLine())!=null)
    		{
    			Matcher m = p.matcher(line);
    			while(m.find())
    			   
    			{
    				 System.out.println(m.group());
    			}
    		}
       }
    
    
    /*
    指定文件中的邮箱地址
    使用获取功能。pattern Matcher
    */
    	public static void getMails()throws Exception
    	{
    		 BufferedReader bufr =
    		   new BufferedReader(new FileReader("mail.txt"));
    
    		 String line = null;
    		 String mailreg = "\w+@\w+(\.\w+)+";
    		 Pattern p = Pattern.complie(mailreg);
    
    		 while((line=bufr.readLine())!=null)
    		{
    			Matcher m = p.matcher(line);
    			while(m.find())
    			{
    				System.out.println(m.group());
    			}
    		}
    
        }
    }




    --------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------












  • 相关阅读:
    bzoj3401[Usaco2009 Mar]Look Up 仰望*
    bzoj2021[Usaco2010 Jan]Cheese Towers*
    bzoj3767A+B Problem加强版
    bzoj3942[Usaco2015 Feb]Censoring*
    bzoj1673[Usaco2005 Dec]Scales 天平*
    bzoj3670[Noi2014]动物园
    stark——pop功能(admin中添加功能)
    stark——快速过滤list_filter
    stark——分页、search、actions
    stark——增删改页面
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207040.html
Copyright © 2011-2022 走看看