黑馬程序員——正則表達式

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

正則表達式
1. 正則表達式
    是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。
    其實就是一種規則。有自己特殊的應用。
    正則就是用於操作字符串的規則,其中是以一些符號來表示規則的.
    可以理解爲:其實符號就是對應了底層的代碼,不用再書寫代碼,
    而是使用一些符號來表示,簡化了書寫. 正則可以簡化對字符串的複雜操作.
2. 正規規則
    (1) 字符
        x 字符x 舉例:A就表示字符A
        \\ 反斜線字符 
        \r 回車
        \n 換行           
    (2) 字符類
        [abc] 表示a,或者b,或者c
        [^abc] 表示任何字符,除了a,b,c
        [a-zA-Z] 52個英文字符的任何一個字符
        [0-9] 0-9之間的任意一個字符    
    (3) 預定義字符類
        . 任何字符
        \d [0-9]同意思
        \w 單詞字符
        [a-zA-Z_0-9]       
    (4) 邊界匹配器
        ^ 行的開頭 
        $ 行的結尾 
        \b 單詞邊界(這裏不是一個單詞字符) "xa?bc ha h"    
    (5) 數量詞 
        X? X,一次或一次也沒有 
        X* X,零次或多次 
        X+ X,一次或多次 
        X{n} X,恰好 n 次 
        X{n,} X,至少 n 次 
        X{n,m} X,至少 n 次,但是不超過 m 次
    (6) 常用正則表達式
        //用戶名:3-15任意字符組合
        var usernameRegex = /^\w{3,15}$/;
        //密碼:6-12任意字符組合
        var passwordRegex = /^\w{6,12}$/;
        //郵箱:自己實現驗證規則
        var emailRegex = /^\w+@\w+(\.\w+)+$/;
        //真實姓名:必須是2-5中文
        var realNameRegex =/^[\u4e00-\u9fa5]{2,5}$/;
3. 正則的功能
    匹配功能: 使用String類中的matches方法。先去學習Pattern類,瞭解規則。 
    字符類,預定義字符類,邊界匹配器,Greedy數量詞
    切割功能: 使用String類中的split方法。
    替換功能: 使用String類中的replaceAll方法。
    獲取功能: 使用的是正則對象Pattern和匹配器Matcher
    在僅使用一次正則表達式時,可以方便地通過此類定義 matches 方法。
    此方法編譯表達式並在單個調用中將輸入序列與其匹配。
    字符串凡是涉及到正則表達式的操作,底層就是Pattern和Matcher對象.
4. 組和捕獲 
    捕獲組可以通過從左到右計算其開括號來編號。
    例如,在表達式 ((A)(B(C))) 中,存在四個這樣的組: 
    1 ((A)(B(C)))    2A      3 (B(C))    4 (C) 
    組零始終代表整個表達式。 以左括號(來找是第幾個組.
    爲了提高規則的複用,用()進行封裝,每一個括號都有一個編號,從1開始.
    爲了複用這個規則,可以通過編號來完成該規則的調用.需要對編號數字進行轉義.
    \\1就代表獲取第一組規則,表示這個地方的字符和第一組規則相同
    //$符號 可以獲取到該方法中正則實際參數中的某一個存在的組,
    通過$加組編號即可String s = str.replaceAll("(.)\\1+","$1");


一些練習:

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
public class RegexDemo {  
   
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        //String str="zhangsan.lisi.wangwu";  
       // String str="c:\\abc\\a.txt";  
        // String str="erkktyqqquizzzzzo";//按照疊詞進行切割  
        // split(str,"\\\\");  
        // split(str,"(.)\\1+");  
         //String str ="wer1389980000ty1234564uiod234345675f";//將字符串中的數據替換成#。  
         //replace(str,"\\d{5,}","#");  
        String str = "erkktyqqquizzzzzo";//將疊詞替換成$.  //將重疊的字符替換成單個字母.  
         replace(str,"(.)\\1+","$1");  
        String tel = "18900001111";  
        System.out.println(checkTel(tel));  
    }  
    public static void split(String str,String regex)  
    {  
         String[] s= str.split(regex);  
         for( String s1:s)  
         {  
          System.out.println(s1);  
         }  
         
    }  
    public static void  replace(String str,Stringregex,String newStr)  
    {  
         String s= str.replaceAll(regex, newStr);  
         System.out.println(s);  
    }  
    /* 
    匹配 
    手機號段只有 13xxx 15xxx 18xxxx 
    */  
    public static boolean checkTel(String str)  
    {  
         
        returnstr.matches("1[358]\\d{9}");  
         
    }  
}  
對字符串進行取出
[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
   
//對字符串進行取出  
public class RegexDemo2 {  
    publicstatic void main(String[] args) {  
        Stringstr = "ming tian jiu yao fang jia le ,da jia。";  
        getString(str,"\\b[a-z]{3}\\b");  
   
    }  
    publicstatic void getString(String str,String regex)  
    {  
        Patternp = Pattern.compile(regex);  
        Matcherm = p.matcher(str);  
        while(m.find())  
        {  
            System.out.println(m.group());  
        }  
           
    }  
   
}  </span>
需求:

       對郵件地址進行校驗

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
import java.util.TreeSet;  
public class RegexTest {  
    public static void main(String[] args) {  
        String mail = "[email protected]";  
      String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";  
      System.out.println(mail.matches(regex));  </span>
  需求:
       將下列字符串轉成:我要學編程. 
<span style="font-size:18px;">[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
String str = "我我...我我...我要..要要...要要...學學學....學學...編編編...編程..程.程程...程...程";  
    String regex1="\\.+";  
     str=str.replaceAll(regex1,"");  
    System.out.println(str);  
     str=str.replaceAll("(.)\\1+","$1");  
    System.out.println(str);*/  
        192.68.1.254 102.49.23.013 10.10.10.102.2.2.2 8.109.90.30</span>
  需求:

        將ip地址進行地址段順序的排序。
        還按照字符串自然順序,只要讓它們每一段都是3位即可。
        1,按照每一段需要的最多的0進行補齊,那麼每一段就會至少保證有3位。
        2,將每一段只保留3位。這樣,所有的ip地址都是每一段3位。 

<span style="font-size:18px;">[java] view plaincopy在CODE上查看代碼片派生到我的代碼片
 String str="192.68.1.254102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";  
      String regex1="(\\d+)";  
      str=str.replaceAll(regex1, "00$1");  
      str=str.replaceAll("0*(\\d{3})", "$1");  
       // System.out.println(str);  
      String[] s= str.split("");  
      TreeSet<String> ts=new TreeSet<String>();  
       for(String s1:s)  
       {  
          ts.add(s1);  
       }  
       for(String s2:ts)  
       {  
          System.out.println(s2.replaceAll("0*(\\d+)", "$1"));  
       }  
    }  
}  </span>


---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity開發</a>、<a href="http://www.itheima.com"target="blank">.Net培訓</a>、期待與您交流! ----------------------

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章