【25】正则表达式

来源:互联网 发布:优化方案答案物理答案 编辑:程序博客网 时间:2024/05/01 13:54

10 正则表达式

 

10.1正则表达式的特点:

正则表达式:符合一定规则的表达式。

         作用:用于专门操作字符串。

         特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。

         所以学习正则表达式,就是在学习一些特殊符号的使用。

 

         好处:可以简化对字符串的复杂操作。

         弊端:符号定义越多,正则越长,阅读性越差。

 

 

具体操作功能:

 

1.   匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

        

2.切割:String split();

 

3.替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

 

正则表达式

 

字符

x 字符 x

\\ 反斜线字符

\0n 带有八进制值 0 的字符 n (0<= n <= 7)

\0nn 带有八进制值 0 的字符 nn (0<= n <= 7)

\0mnn 带有八进制值 0 的字符 mnn(0 <= m<= 3、0 <= n <= 7)

\xhh 带有十六进制值 0x 的字符 hh

\uhhhh 带有十六进制值 0x 的字符 hhhh

\t 制表符 ('\u0009')

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

\r 回车符 ('\u000D')

\f 换页符 ('\u000C')

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

\e 转义符 ('\u001B')

\cx 对应于 x 的控制符

 

字符类

[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](减去)

 

预定义字符类

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

\d 数字:[0-9]

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

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

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

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

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

 

边界匹配器

^ 行的开头

$ 行的结尾

\b 单词边界

\B 非单词边界

\A 输入的开头

\G 上一个匹配的结尾

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

\z 输入的结尾

 

Greedy数量词

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

X* X,零次或多次

X+ X,一次或多次

X{n} X,恰好 n 次

X{n,} X,至少 n 次

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

 

 

class RegexDemo{         public static void main(String[] args)         {                   //demo();                   //System.out.println((char)11);                   //checkTel();                    //splitDemo("zhangsan.lisi.wangwu","\\.");//  单独的.表示任意字符,需要用转义字符表示"."=\\.                   //splitDemo("c:\\abc\\a.txt","\\\\");                   //splitDemo("zhangsan   lisi      wangwu"," +")//按照多个空格进行切割                    //splitDemo("erkktyqqquizzzzzo","(.)\\1+");                   /*按照叠词完成切割。为了可以让规则的结果被重用                   可以将规则封装成一个组。用()完成。组的出现都有编号。                   从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。*/                    String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数组替换成#。                                     //replaceAllDemo(str,"\\d{5,}","#");                    //将叠词替换成$. 将重叠的字符替换成单个字母。zzzz->z                   String str1 = "erkktyqqquizzzzzo";                   replaceAllDemo(str1,"(.)\\1+","$1");                           }          public static void replaceAllDemo(String str,String reg,String newStr)         {                   str= str.replaceAll(reg,newStr);                    System.out.println(str);         }            public static void splitDemo(String str,String reg)         {                                     //String reg = " +";//按照多个空格来进行切割                   String[] arr = str.split(reg);                    System.out.println(arr.length);                   for(String s : arr)                   {                            System.out.println(s);                   }         }          /*         匹配         手机号段只有 13xxx15xxx 18xxxx          */         public static void checkTel()         {                   String tel = "16900001111";                   String telReg = "1[358]\\d{9}";                   System.out.println(tel.matches(telReg));         }          public static void demo()         {                   Strings tr = "b23a23456789";                    String reg = "[a-zA-Z]\\d*";//第一个字符是小写或大写字母,\\d表示0-9任意数字                    boolean b= str.matches(reg);                   System.out.println(b);         }          /*         对QQ号码进行校验         要求:5~15  0不能开头,只能是数字                 这种方式,使用了String类中的方法,进行组合完成了需求。但是代码过于复杂。          */         public static void checkQQ()         {                   String qq = "123a454";                    String regex = "[1-9]\\d{4,14}";                    boolean flag = qq.matches(regex);                   if(flag)                            System.out.println(qq+"...isok");                   else                            System.out.println(qq+"...不合法");          } }


 

正则表达式的第四个功能。

4,获取:将字符串中的符合规则的子串取出。

 练习二:正则表达式的第四个功能 获取

/* 操作步骤:1,将正则表达式封装成对象。2,让正则对象和要操作的字符串相关联。3,关联后,获取正则匹配引擎。4,通过引擎对符合规则的子串进行操作,比如取出。  */import java.util.regex.*; class RegexDemo2{         public static void main(String[] args)         {                   getDemo();         }         public static void getDemo()         {                   String str = "ming tian jiu yao fang jia le ,da jia。";                   System.out.println(str);                   String reg = "\\b[a-z]{4}\\b";                    //将规则封装成对象。                   Pattern p = Pattern.compile(reg);                    //让正则对象和要作用的字符串相关联。获取匹配器对象。                   Matcher m  = p.matcher(str);                    //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。                                                                                             //只不过被String的方法封装后,用起来较为简单。但是功能却单一。 //               boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。//               System.out.println(b);//               System.out.println(m.group());//用于获取匹配后结果。                                     //这里如果进行匹配,指针先按照规则走了一次,以后匹配器匹配的都是在这个指针的基础上查找的                   //System.out.println("matches:"+m.matches());                   while(m.find())                   {                            System.out.println(m.group());                            System.out.println(m.start()+"...."+m.end());                   }         }}


 

练习三:正则表达式的应用

 

/*         需求:         将下列字符串转成:我要学编程.                 到底用四种功能中的哪一个呢?或者哪几个呢?         思路方式:         1,如果只想知道该字符是否对是错,使用匹配。         2,想要将已有的字符串变成另一个字符串,替换。         3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。         4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。         */import java.util.regex.*;class RegexText{         public static void main(String[] args)         {                   String str = "我我...我我...我要..要要...要要...学学学....学学...编编编...编程..程.程程...程...程";                   String regex1 = "(\\.)\\1*";                   String str1 = str.replaceAll(regex1,"");                    String regex2 = "(.)\\1+";                   String str2 = str1.replaceAll(regex2,"$1");                    System.out.println("str:"+str);                   System.out.println("str1:"+str1);                   System.out.println("str1:"+str2);         }}


 

 

练习四:邮箱验证和IP段排序

 

import java.util.*;class RegexTest{         public static void main(String[] args)         { //               ipSort();                    checkMail();         }          /*         需求:对邮件地址进行校验。          */         public static void checkMail()         {                   String mail = "abc12@sina.com";                    mail= "1@1.1";                    Stringreg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。                   reg= "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。                    //mail.indexOf("@")!=-1                    System.out.println(mail.matches(reg));         }          /*         192.68.1.254102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30         将ip地址进行地址段顺序的排序。           还按照字符串自然顺序,只要让它们每一段都是3位即可。         1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位。         2,将每一段只保留3位。这样,所有的ip地址都是每一段3位。          */         public static void ipSort()         {                   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+)","00$1");                   System.out.println(ip);                    ip= ip.replaceAll("0*(\\d{3})","$1");                   System.out.println(ip);                    String[] arr = ip.split(" ");                    TreeSet<String> ts = new TreeSet<String>();                    for(String s : arr)                   {                            ts.add(s);                   }                    for(String s : ts)                   {                            System.out.println(s.replaceAll("0*(\\d+)","$1"));                   }         } }


 

练习五:网页爬虫,抓取页面内的所有邮箱地址

 

/*网页爬虫(蜘蛛)*/import java.io.*;import java.util.regex.*;import java.net.*;import java.util.*;class RegexTest2{         public static void main(String[] args) throws Exception         {                   getMails_1();         }           public static void getMails_1()throws Exception         {                   URL  url = new URL("http://192.168.1.254: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)                   {                            Matcherm = 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.compile(mailreg);                      while((line=bufr.readLine())!=null)                   {                            Matcher m = p.matcher(line);                            while(m.find())                            {                                     System.out.println(m.group());                            }                   }         }}


原创粉丝点击