天天看點

黑馬程式員--- 正規表達式

 ------- android教育訓練、java教育訓練、期待與您交流! ----------

1什麼是正規表達式

正規表達式就是具有一定規則的字元串,正規表達式是用操作字元串的。

正規表達式的規則:

如:

[123],表示某一位必須是123.

[a-zA-Z]表示某一位必須是A—Z的大小寫字母。

[a-m[q-z]]表示某一位必須是a-m或q-z小寫字母。

[a-z&&[^def]]表示某一位必須是a-z除了def.的小寫字母。

[a-z&&[^l-q]]表示某一位必須是a-z除了l-q的小寫字母。

[^012]表示某一位不能是012數字。

[a-z&&[def]]表示某一位隻能是def小寫字母。

預定義字元

\d表示0-9數字。

\D表示[^0-9]

\w表示[a-zA-Z_0-9]

\W表示不能是大小寫字母,數字和下劃線:[^\w]。

\s表示空白字元

\S表示不能是空白字元:[^\s]

.表示任意字元。

注意:在使用下面有反斜線的表達式時,,因為反斜線屬于轉義字元,必須要再加上一個反斜線對其進行轉意。如:

“\\d”.

邊界比對器
^ 行的開頭
$ 行的結尾
\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 次

正規表達式是用來操作字元串的,可以進行以下幾種操作:比對、切割、替換、擷取。

1, 比對

調用String類的matches(String regex);方法,用字元串和指定的正則進行比對。傳回值為boolean,為true表示字元串和正規表達式相比對,否則不比對。

如:

定義比對手機号的正規表達式:要求,第一位不能是0,第二位隻能是3,4,5,8。

public class RegexDemo {
      public static void main(String[] args) {
             String regex="1[3458]\\d{9}";

             String str="13834530020";

             System.out.println(str.matches(regex));//true     

      }

}

           

比對使用者名:要求,不能以數字開頭,必須是 5 - 15 位。

public class RegexDemo {
      public static void main(String[] args) {

             String regex="[^\\d][\\w]{4,14}";

             String str="michlejackson";

             String str1="00abcdef";

             System.out.println(str.matches(regex));//true

             System.out.println(str1.matches(regex));     //false

             

      }

}

 
           

2, 切割

調用String類中的String[] split(String regex);方法對字元按指定的正規表達式進行切割,傳回一個字元串數組。

如:

public class RegexDemo {

      public static void main(String[] args) {

//将包含不固定數量空格的姓名字元串,将空格去除。

             String str="zhangsan      lisi  wangcai";

             String regex=" +";//表示空格數出現一次或多次。

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

             for(String s:arr){

                    System.out.println(s);
             }
      }
}

/*列印結果:

zhangsan

lisi

wangcai

*/

public class RegexDemo {
      public static void main(String[] args) {

             //将姓名字元串中的字線去除。

             String str="張三ooooooo李四bbbbb旺财";

             String regex="(.)\\1+";//将任意字元定義為組,第二位使用重複第一組内容,重複一次或多次。

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

             for(String s:arr){

                    System.out.println(s);
             }
      }
}

/*列印結果:

張三

李四

旺财

*/

           

3,替換

調用 String類中的replaceAll(String regex,String str);用指定的字元串,替換比對指定正規表達式的字元串。

如:

public class RegexDemo {

 

      public static void main(String[] args) {

             //将姓名字元串中的一人疊詞替換多個疊詞。

             String str="張三ooooooo李四bbbbb旺财";

             String regex="(.)\\1+";//将任意字元定義成組,第二位重複第一位的内容,重複多次。

             str=str.replaceAll(regex, "$1");//$1表示,使用第一組的内容。

             System.out.println(str);
      }
}

/*列印結果:

張三o李四b旺财

*/
           

4,擷取

要擷取比對正規表達式的字元串,需要調用Matcher對象中的group()方法,是以這裡可以先将正規表達式封裝成Pattern對象,再通過此對象的matcher(String str)方法,擷取Matcher對象。

如:

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexDemo {

      public static void main(String[] args) {
             
             //擷取字元串中三個字母的字元串。

             String str="abc fafa afaei ppp opo ip oopp oe4 33 eee iii";

             Pattern  p=Pattern.compile("\\b[a-z0-9]{3}\\b");

             Matcher m=p.matcher(str);

             while(m.find()){

                    System.out.println(m.group());
             }
      }
}

/*

列印結果:

abc

ppp

opo

oe4

eee

iii

*/