正則表達式的理解

正則表達式
* 是用來操作字符串,用一下具有特殊意義的符號,來匹配,分割,獲取,替換字符串的操作,

* 代碼簡便了,但代碼的可讀性差了。。


正則表示式的一些常用符號:

 字符類 
[abc] 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 次 


簡單的例子來說明正則表達式的用法:


* 需求:定義一個功能對QQ號進行校驗。
* 要求:長度5~15. 只能是數字, 0不能開頭


String qq = "4535434345";
String regex ="[1-9]\\d{4,14}"; 。//正則表達式的一種寫法

//"[1-9][0-9]{4,14}"; 另一種寫法,和上面的一種寫法的效果完全一樣。

boolean fls = qq.matches(regex);//直接操作,下面幾行的簡寫,也可以寫成下面的樣式。

/*
 Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(qq);
boolean b = m.matches();*/


System.out.println(qq+":"+b);
}



/*
* 正則表達式對字符串的常見操作:
* 1, 匹配。
* 其實使用的就是String類中的matches方法。

* 2,切割。
* 其實使用的就是String類中的split方法。 

* 3,替換。
* 其實使用的就是String類中的replaceAll()方法。

* 4,獲取。
*
*/




/*
* 獲取 
* 將正則規則進行對象的封裝。 
* Pattern p = Pattern.compile("a*b");
*  //通過正則對象的matcher方法字符串相關聯。獲取要對字符串操作的匹配器對象Matcher .
  * Matcher m = p.matcher("aaaaab");
  * //通過Matcher匹配器對象的方法對字符串進行操作。
  * boolean b = m.matches();


*/
public  static void functionDemo_4() {

String str = "dae jia hao,ming tian bu fang jia!";

String regex = "\\b[a-z]{3}\\b";

//1,將正則封裝成對象。
Pattern p = Pattern.compile(regex);
//2, 通過正則對象獲取匹配器對象。 
Matcher m = p.matcher(str);

//使用Matcher對象的方法對字符串進行操作。
//既然要獲取三個字母組成的單詞 
//查找。 find();
System.out.println(str);
while(m.find()){
System.out.println(m.group());//獲取匹配的子序列

System.out.println(m.start()+":"+m.end());
}
}


/*
* 替換 
*/
public static void functionDemo_3() {

String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";

str = str.replaceAll("(.)\\1+", "$1");

System.out.println(str);

String tel = "15800001111";//158****1111;

tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

System.out.println(tel);

}


/*
* 切割。

* 組:((A)(B(C))) 
*/
public static void functionDemo_2(){


String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";

String[] names = str.split("(.)\\1+");//str.split("\\.");

for(String name : names){
System.out.println(name);
}

}
/*
* 演示匹配。 
*/
public static void functionDemo_1(){


//匹配手機號碼是否正確。 
String tel = "15800001111";

String regex = "1[358]\\d{9}";   

boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
}



















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