java---正则表达式

来源:互联网 发布:js拼接json字符串 编辑:程序博客网 时间:2024/06/06 01:46

指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Mathcer 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。其实在String类中也封装了Matcher对象,在字符串中调用了replaceAll方法的内部也是通过正则表达式来实现的,正则表达式的使用方便了对字符串的操作,但是如果对字符串的操作较为复杂,就有使得正则表达式的可读性较低,不利于其它人员的复用。

常用的正则表达式有:

字符类
[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](并集)


预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\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     输入的开头                            


Greedy数词量---->匹配整个字符串
X?     X,一次或一次也没有           
X*     X,零次或多次                             
X+        X,一次或多次                          
X{n}       X,恰好n次                        
X{n,}       X,至少n次                      
X{n,m}         X,至少n次,但不超过m次              


类似与字符串的方法正则表达式主要有四种具体功能:匹配、切割、替换和获取

下面的代码是对qq号的筛选,电话号码也是类似的匹配规则。

[java] view plaincopy
  1. //匹配  
  2.     /* 
  3.      * 1、对qq号进行校验 
  4.      * 要求:5~15  0不能开头,只能是数字 
  5.      */  
  6.     //非正则写法  
  7.     public static void checkQQ1(String qqStr){  
  8.         int len = qqStr.length();  
  9.         if(len>=5 && len<=15){  
  10.             if(qqStr.indexOf(0)!='0'){  
  11.                 Long l = Long.parseLong(qqStr);  
  12.                 System.out.println("qq为:" + l);  
  13.             }  
  14.             else  
  15.                 System.out.println("不可以0开头");  
  16.         }  
  17.         else  
  18.             System.out.println(qqStr + "不合法");  
  19.     }  
  20.     //正则写法  
  21.     public static void checkQQ(String qqStr){  
  22.         //定义规则  
  23.         String reg = "[1-9]\\d{4,14}";  
  24.         if(qqStr.matches(reg))  
  25.             System.out.println("qq:" + qqStr);  
  26.         else  
  27.             System.out.println(qqStr + "不是qq号");  
  28.     }  
  29.     //匹配电话号码  
  30.     /* 
  31.      * 1、手机号段只有 13xxx 15xxx 18xxxx 
  32.      * 2、座机号:010-65784236,0316-3312617,022-12465647,03123312336 
  33.      */  
  34.     public static void checkTel(String telStr, String regex){         
  35.         if(telStr.matches(regex))  
  36.             System.out.println(telStr);  
  37.         else  
  38.             System.out.println("此号码非电话号");  
  39.     }  

下面的代码是切割代码的演示

[java] view plaincopy
  1. class  RegexDemo  
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         //demo();  
  6.         //System.out.println((char)11);  
  7. //      checkTel();  
  8.         //splitDemo("zhangsan.lisi.wangwu","\\.");  
  9.         //splitDemo("c:\\abc\\a.txt","\\\\");  
  10.         //splitDemo("erkktyqqquizzzzzo","(.)\\1+");//按照叠词完成切割。为了可以让规则的结果被重用  
  11.     <span style="white-space:pre">                      </span>  //可以将规则封装成一个组。用()完成。组的出现都有编号。  
  12.                              //从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。  
  13.         String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数组替换成#。       
  14.         //replaceAllDemo(str,"\\d{5,}","#");  
  15.         String str1 = "erkktyqqquizzzzzo";//将叠词替换成$.  //将重叠的字符替换成单个字母。zzzz->z  
  16.         replaceAllDemo(str1,"(.)\\1+","$1");          
  17.     }  
  18.   
  19.     public static void replaceAllDemo(String str,String reg,String newStr)  
  20.     {  
  21.         str = str.replaceAll(reg,newStr);  
  22.         System.out.println(str);  
  23.     }  
  24.   
  25.     public static void splitDemo(String str,String reg)  
  26.     {         
  27.         //String reg = " +";//按照多个空格来进行切割  
  28.         String[] arr = str.split(reg);    
  29.         System.out.println(arr.length);  
  30.         for(String s : arr)  
  31.         {  
  32.             System.out.println(s);  
  33.         }  
  34.     }  
  35. }  
下面是获取的代码:

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

[java] view plaincopy
  1. import java.util.regex.*;  
  2.   
  3. class RegexDemo2   
  4. {  
  5.     public static void main(String[] args)   
  6.     {  
  7.         getDemo();  
  8.     }  
  9.     public static void getDemo()  
  10.     {  
  11.         String str = "ming tian jiu yao fang jia le ,da jia。";  
  12.         System.out.println(str);  
  13.         String reg = "\\b[a-z]{4}\\b";  
  14.         //将规则封装成对象。  
  15.         Pattern p = Pattern.compile(reg);  
  16.         //让正则对象和要作用的字符串相关联。获取匹配器对象。  
  17.         Matcher m  = p.matcher(str);  
  18.         //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。  
  19.                                         //只不过被String的方法封装后,用起来较为简单。但是功能却单一。  
  20. //      boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。  
  21. //      System.out.println(b);  
  22. //      System.out.println(m.group());//用于获取匹配后结果。        
  23.         //System.out.println("matches:"+m.matches());  
  24.         while(m.find())  
  25.         {  
  26.             System.out.println(m.group());  
  27.             System.out.println(m.start()+"...."+m.end());  
  28.         }  
  29.     }  
  30. }  

除了以上直接对字符串的操作外,正则表达式的最典型应用场景还有网页爬虫(从网页的源码中筛选出邮箱)。正则表达式的语法规则简单,但功能却十分强大,java语言的封装运用的相当到位。这也是java语言的发张趋势。
0 0
原创粉丝点击