* 是用來操作字符串,用一下具有特殊意義的符號,來匹配,分割,獲取,替換字符串的操作,
* 代碼簡便了,但代碼的可讀性差了。。
正則表示式的一些常用符號:
字符類
[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);
}