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


 

正则表达式

  正则表达式用于操作字符串数据。通过一些特定的符号来体现的。所以我们为了掌握正则表达式,必须要学习一些符号。
  正则表达式可以简化对字符串的复杂操作。虽然简化了操作,但是阅读性差。

1、常见符号

       说明:X表示字符X或者匹配的规则。

  1、字符

        x                  字符 x

        \\                 反斜线字符

        \t                 制表符 ('\u0009')

        \n                 新行(换行)符 ('\u000A')

        \r                 回车符 ('\u000D')

        \f                 换页符 ('\u000C')

        \a                 报警 (bell) 符 ('\u0007')

  2、字符类

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

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

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

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

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

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

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

  3、预定义字符类

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

        \d                        数字:[0-9]

        \D                       非数字: [^0-9]

        \s                        空白字符:[ \t\n\x0B\f\r]

        \S                       非空白字符:[^\s] 

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

        \W                      非单词字符:[^\w]

  4、边界匹配器

        ^                         行的开头

        $                         行的结尾

        \b                        单词边界

        \B                       非单词边界

        \A                       输入的开头

        \G                       上一个匹配的结尾

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

        \z                        输入的结尾

  5、Greedy数量词

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

        X*                       X,零次或多次

        X+                       X,一次或多次

        X{n}                    X,恰好 n次

        X{n,}                   X,至少 n次

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

  6、组和捕获

       捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:

                    1     ((A)(B(C)))

                    2     \A

                    3     (B(C))

                    4     (C)

       组零始终代表整个表达式。在替换中常用$匹配组的内容。

2、功能

  正则表达式常见功能:匹配、切割、替换、获取

  匹配其实使用的就是String类中的matches方法。

  切割其实使用的就是String类中的split方法。

  替换其实使用的就是String类中的replace方法。

  获取将正则规则进行对象的封装。Pattern p = Pattern.compile("a*b");通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher。

演示匹配:

1     static void demo1()
2     {
3         String tel = "15800001111";
4         //手机号的匹配规则,第一位是1,第二位是358,后面9位数字
5         String regex = "1[358]\\d{9}";
6         boolean b = tel.matches(regex);
7         System.out.println(tel + ":" + b);
8     }

演示切割:

 1 static void demo2()
 2     {
 3         String str = "zhangsan xiaoqiang zhaoliu";
 4         //匹配一个或者多个空格为
 5         String[] names = str.split(" +");
 6         for(String name : names){
 7         System.out.println(name);
 8         }
 9         str = "zhangsan.xiaoqiang.zhaoliu";
10         //以点为分隔符
11         names = str.split("\\.");
12         for(String name : names){
13         System.out.println(name);
14         }
15 
16         str = "zhangsanttttxiaoqiangmmmmmzhaoliu";
17         //.表示任意字符,(.)表示一组,\\1+表示与第1组相同的出现1次以上
18         names = str.split("(.)\\1+");
19         for(String name : names){
20         System.out.println(name);
21         }
22     }

演示替换: 

 1 public static void demo5()
 2     {
 3         String str = "zhangsanttttxiaoqiangmmmmmzhaoliu";
 4         //与分隔一样,这里也是以一个字符替换叠词
 5         str = str.replaceAll("(.)\\1+","$1");
 6         System.out.println(str);
 7 
 8         //替换一个手机号码的中间四位为*
 9         str = "15800001111";
10         str = str.replaceAll("(\\d{3})(\\d{4})(\\d{4})","$1****$2");
11         System.out.println(str);
12     }

演示获取:

 1 static void demo6()
 2     {
 3         String str = "da jia hao,ming tian bu fang jia";
 4         //获取三个字母组成的单词的正则
 5         String regex = "\\b[a-z]{3}\\b";
 6         //1. 将正则封装成对象
 7         Pattern p = Pattern.compile(regex);
 8         //2. 通过正则对象获取匹配器对象
 9         Matcher m = p.matcher(str);
10         //查找:find();
11         while(m.find())
12         {
13             System.out.println(m.group());//获取匹配的子序列
14             System.out.println(m.start() + ":" + m.end());
15         }    
16     }

  Pattern类为正则表达式的编译表示形式。指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。

下面通过一些小练习来熟悉一下正则表达式

 1 import java.util.*;
 2 class Myregex 
 3 {
 4     public static void main(String[] args) 
 5     {
 6         exec01();
 7     }
 8     /*
 9      1.  治疗口吃:我我 ... 我我 ... 我我我我 ... 要要要要 ... 
10      要要要要 ... 学学学学学 ...学学编编 ... 编编编编 .. 编 .. 编 ... 程程 ... 程程程
11     除去重复的字符。
12     */
13     static void exec01()
14     {
15         String str="我我...我我...我我我我...要要要要..要要要要...学学学学学...学学编编.编编编编..编..编...程程...程程程";
16         //1、去掉.,.比较特殊,在正则中代表任意字符所以要加转意符
17         str=str.replaceAll("\\.+","");
18         //2、替换叠词;
19         str=str.replaceAll("(.)\\1+","$1");
20         System.out.println(str);
21     }
22 }

结果为:

 

 

 1 import java.util.*;
 2 class Myregex 
 3 {
 4     public static void main(String[] args) 
 5     {
 6         exec02();
 7     }
 8     /*
 9     2、对邮件地址的校验
10     */
11     static void exec02()
12     {
13         String mail = "abc1@sina.com";
14         
15         String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
16         //不精确的校验可以写为“\\w+@\\w+(\\.\\w)+”;
17         boolean b=mail.matches(regex);
18         System.out.println(b);
19     }
20 }

结果为真

 正则表达式主要在于符号的熟悉,需要勤加练习,多练就能记住各个符号,就能熟能生巧,写出高效的正则表达式。

 

posted @ 2015-09-27 21:36    阅读(190)  评论(0编辑  收藏  举报