概述: java.util.regex是一個用正則表達式所訂製的模式來對字符串進行匹配工做的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表達式經編譯後的表現模式。 Matcher 一個Matcher對象是一個狀態機器,它依據Pattern對象作爲匹配模式對字符串展開匹配檢查。 首先一個Pattern實例訂製了一個所用語法與PERL的相似的正則表達式經編譯後的模式,而後一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工做。java
1、正則表達式規則概述面試
首先記住幾個常見的規則:正則表達式
一、開始與結束 :^ 爲開始表示, $ 爲結束標誌api
舉例: 以"a" 開始,"b"結束的字符串 "^[a](.)+[b]$"編碼
System.out.println("acb11b".matches("^[a](.)+[b]$")); //true
二、限定詞 : 「*」 表示零次或者屢次,等價於{0, }、 」+ 「至少一次 等價於{1,} 、「?」 表示0-1次 等價於{0,1}。 至於其餘次數好比至少n次,不超過m次,那就是{n,m}表示spa
舉例: 以數字開頭,出現3次數字,後面是英文。.net
System.out.println("123acb11b".matches("[0-9]{3}(.)*"));//true
三、常見規則: [0-9] 數字,[a-zA-Z], 大小寫字母 ,\\w 表示數字和英文大小寫。code
至於其餘正則表達式規則, 參考java1.8JDK文檔,Pattern類 http://tool.oschina.net/apidocs/apidoc?api=jdk-zh對象
2、String中的運用、matches()、split()、replace()blog
一、matches() 判斷字符串是否符合規則
// ^1[3|4|5|8][0-9]\d{9}$ 手機正則
若是對正則規則還不太熟悉, 那麼來解釋一下(其實寫法不是惟一的)
^1 : 以「1」開頭
[3|4|5|8]:第二位必須是3458其中一個
\d{9}$ :9個任意數字結尾
static void testMed(String str) { String p = "^1[3|4|5|8][0-9]\d{9}$ "; System.out.println(str.matches(p)); }
二、replace() 字符替換
//去除空格 String str = "aa bbc a d".replaceAll(" +","");
以上內容是正則表達式的簡單用法
3、正則表達式對象
java.util.regex是一個用正則表達式所訂製的模式來對字符串進行匹配工做的類庫包。它包括兩個類:Pattern和Matcher Pattern 一個Pattern是一個正則表達式經編譯後的表現模式。 Matcher 一個Matcher對象是一個狀態機器,它依據Pattern對象作爲匹配模式對字符串展開匹配檢查。 首先一個Pattern實例訂製了一個所用語法與PERL的相似的正則表達式經編譯後的模式,而後一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工做。
//JDK提供的經典調用 Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
瞭解一下關於 ,捕獲組的概念
捕獲組能夠經過從左到右計算其開括號來編號,編號是從1 開始的。例如,在表達式 ((A)(B(C)))中,存在四個這樣的組:
1 ((A)(B(C))) 2 (A) 3 (B(C)) 4 (C)
組零始終表明整個表達式。 以 (?) 開頭的組是純的非捕獲 組,它不捕獲文本,也不針對組合計進行計數。
與組關聯的捕獲輸入始終是與組最近匹配的子序列。若是因爲量化的緣故再次計算了組,則在第二次計算失敗時將保留其之前捕獲的值(若是有的話)例如,將字符串"aba" 與表達式(a(b)?)+ 相匹配,會將第二組設置爲 "b"。在每一個匹配的開頭,全部捕獲的輸入都會被丟棄。
(1)、舉例: 經典面試題,去除String中重複的字符
String str = "aaav.*sddff+ss"; String regex = "(.)\\1+"; //組的概念,(.)表示任意字符、\\1表示引用第一組(.) 「+」至少出現一次 //正則表達式對象 Pattern p = Pattern.compile(regex); //匹配對象 Matcher matcher = p.matcher(str); String res = matcher.replaceAll("$1"); //$1:指的是第一組的一個元素 System.out.println(res);//av.*sdf+s
//str.replaceAll("(.)\\1+","$1"); //同樣的意思: av.*sdf+s
(2)、 找出字符串中三個字母的字符串輸出
/** find()判斷是否存在規則下的字符串 group() 迭代取值 \\b 開始與結尾標誌 */ private static void med() { String str = "aa abnb abjs anh asj h ashj"; String regex = "\\b[a-zA-Z]{3}\\b";//找出三個字符組成的串 Matcher m = Pattern.compile(regex).matcher(str); while(m.find()){ System.out.println(m.group()); //anh asj 不會取出abnb這種4個的、緣由就是使用了\\b修飾
} }
3、經常使用的正則表達式
規則 | 正則表達式語法 |
一個或多個漢字 | ^[\u0391-\uFFE5]+$ |
郵政編碼 | ^[1-9]\d{5}$ |
QQ號碼 | ^[1-9]\d{4,10}$ |
郵箱 | ^[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\.){1,3}[a-zA-z\-]{1,}$ |
用戶名(字母開頭 + 數字/字母/下劃線) | ^[A-Za-z][A-Za-z1-9_-]+$ |
手機號碼 | ^1[3|4|5|8][0-9]\d{8}$ |
URL | ^((http|https)://)?([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ |
18位身份證號 | ^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$ |