Java正則表示式筆記
阿新 • • 發佈:2020-07-18
正則表示式
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]") //沒考慮閏年和年份