1. 程式人生 > 實用技巧 >Java正則表示式筆記

Java正則表示式筆記

正則表示式

1.概念

正則表示式,又稱規則表示式。(英語:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文字。

  • 正則表示式是對字串操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯。
  • 給定一個正則表示式和另一個字串,我們可以達到如下的目的:
    • 1.給定的字串是否符合正則表示式的過濾邏輯(稱作“匹配”);
    • 2.可以通過正則表示式,從字串中獲取我們想要的特定部分。(爬蟲應用)
  • 相關類:

java.lang.String

java.util.regex.Pattern

java.util.regex.Matcher

2.正則表示式(常見的規則)

  • 兩個特殊的符號'^'和'$'。他們的作用是分別指出一個字串的開始和結束。例子如下:
//兩個特殊的符號'^'和'$'。他們的作用是分別指出一個字串的開始和結束
"^The":表示所有以"The"開始的字串("There","The cat"等);
"of despair$":表示所以以"of despair"結尾的字串;
"^abc$":表示開始和結尾都是"abc"的字串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字串。
// * ? +來表示次數
"ab*":表示一個字串有一個a後面跟著零個或若干個b。("a", "ab", "abbb",……);
"ab+":表示一個字串有一個a後面跟著至少一個b或者更多;
"ab?":表示一個字串有一個a後面跟著零個或者一個b;
"a?b+$":表示在字串的末尾有零個或一個a跟著一個或幾個b。
   
// {}指定範圍
"ab{2}":表示一個字串有一個a跟著2個b("abb");
"ab{2,}":表示一個字串有一個a跟著至少2個b;
"ab{3,5}":表示一個字串有一個a跟著3到5個b。
 
// . 可以代替任何字元  
"a.[0-9]":表示一個字串有一個"a"後面跟著一個任意字元和一個數字;
"^.{3}$":表示有任意三個字元的字串(長度為3個字元);
方括號表示某些字元允許在一個字串中的某一特定位置出現:
"[ab]":表示一個字串有一個"a"或"b"(相當於"a¦b");
"[a-d]":表示一個字串包含小寫的'a'到'd'中的一個(相當於"a¦b¦c¦d"或者"[abcd]");
"^[a-zA-Z]":表示一個以字母開頭的字串;
"[0-9]%":表示一個百分號前有一位的數字;
",[a-zA-Z0-9]$":表示一個字串以一個逗號後面跟著一個字母或數字結束。
 可以在方括號裡用'^'表示不希望出現的字元,'^'應在方括號裡的第一位。
(如:"%[^a-zA-Z]%"表示兩個百分號中不應該出現字母)。為了逐字表達,你必須在"^.$()|*+?{\"這些字元前加上轉移字元'\'。
字元類 
[abc] ----   a、b 或 c(簡單類) (某一位上只能是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 次

3.常用操作

//1、匹配其實使用的就是String類中的matches()方法
"15115282455".matches("1[3-9]\\d{9}")
//2、切割其實使用的就是String類中的split()方法
System.out.println(Arrays.toString("lzp.is.666".split("\\.")));
System.out.println(Arrays.toString("lzp  is 666".split(" +")));
System.out.println(Arrays.toString("zhangsantttxiaowangqqqlaowangzzz".split("(.)\\1+")));    //[zhangsan, xiaowang, laowang] 重複字元出現多個時分為一組看次數來分割
//3、替換其實使用的就是String類中的replaceAll()方法
System.out.println("zhangsantttxiaowangqqqlaowangzzz".replaceAll("(.)\\1+","$1")); //zhangsantxiaowangqlaowangz  將字串中重複的多個字元用一個字元替換

4.案例

4.1匹配手機號

String regex = "1[3-9][0-9]{9}";
String regex = "1[3-9]\\d{9}";
System.out.println("15115282455".matches(regex));

4.2匹配三個字母組成的單詞

public static void main(String[] args) throws IOException {
    //獲取三個字母組成的單詞
    String str = "da jia hao,ming tian bu fang jia";
    //String regex = "[a-z]{3}";
    String regex = "\\b[a-z]{3}\\b";//  單詞邊界 \\b

    //1、將正則規則進行物件的封裝
    Pattern p = Pattern.compile(regex);
    //2、通過正則物件獲取匹配器物件
    Matcher m = p.matcher(str);
    //3、使用Matcher物件的方法對字串進行操作。
    // 既然要獲取三個字母組成的單詞
    // 查詢find();
    //    	m.find();
    //    	System.err.println(m.group());//獲取匹配的子序列
    System.out.println(str);
    while(m.find()){
        System.out.println(m.group());//獲取匹配的子序列
        System.out.println(m.start()+" : "+m.end());
    }
}

4.3匹配必須包含字母、數字

username.matches("[^a-z]+|[^A-Z]+|[^0-9]+")   //如果不包含大寫、小寫、數字中的任何一個則為true

4.4匹配身份證(自制)

idCard.matches("\\d{6}\\d{4}(([0][1-9])|([1][0-2]))(([0][1-9])|([1][0-9])|([2][0-9])|([3][0-1]))[0-9]{3}[xX0-9]")   //沒考慮閏年和年份