Java基礎七-正則表達式 一、定義: 特定的符號的組合 二、作用: 用於操作字元串數據 三、優缺點 簡化代碼,但是閱讀性差 四、引入 4.1 問題 判斷一個號碼是否是QQ號? 不是零開頭 6-15位 只含有數字 4.2 代碼 4.3 要點 if(!qq.startsWith("0")) 判斷不是零 ...
Java基礎七-正則表達式
一、定義:
特定的符號的組合
二、作用:
用於操作字元串數據
三、優缺點
簡化代碼,但是閱讀性差
四、引入
4.1 問題
判斷一個號碼是否是QQ號?
不是零開頭
6-15位
只含有數字
4.2 代碼
1 int len = qq.length(); 2 3 if(len>=5 && len<=15){ 4 5 if(!qq.startsWith("0")){ 6 try { 7 long l = Long.parseLong(qq); 8 9 System.out.println(l+":正確"); 10 }catch(NumberFormatException e){ 11 System.out.println(qq+":含有非法字元"); 12 } 13 14 }else{ 15 System.out.println(qq+":不能0開頭"); 16 } 17 }else{ 18 System.out.println(qq+":長度錯誤"); 19 } 20 }
4.3 要點
if(!qq.startsWith("0"))
判斷不是零開頭
long l = Long.parseLong(qq);
判斷全是數字
五、正則表達式解決引入
5.1 代碼
String regex = "[1-9][0-9]{4,14}";//正則表達式。
boolean b = qq.matches(regex);
System.out.println(qq+":"+b);
5.2 說明
String regex = "[1-9][0-9]{4,14}";
第一位[1-9]
第二位[0-9]
後面[0-9]{4,14}重覆4-14次
中括弧表示取值,大括弧表示次數,小括弧表示組
六、正則表達式的構造摘要
java.util.regex
類 Pattern中
七、正則表達式的構造摘要簡介
7.1 字元類
[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](減去)
7.2 字元
x 字元 x
\\ 反斜線字元
7.3 預定義字元類
. 任何字元(與行結束符可能匹配也可能不匹配)
\d 數字:[0-9]
\D 非數字: [^0-9]
\s 空白字元:[ \t\n\x0B\f\r]
\S 非空白字元:[^\s]
\w 單詞字元:[a-zA-Z_0-9]
\W 非單詞字元:[^\w]
7.4 Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
7.5 邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
八、正則表達式對字元的常見操作
* 正則表達式對字元串的常見操作:
* 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();
8.1 匹配
//匹配手機號碼是否正確。
String tel = "15800001111";
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
8.2 切割
將字元串中的人名分割開
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
String[] names = str.split("(.)\\1+");//str.split("\\.");
for(String name : names){
System.out.println(name);
}
小括弧是組,(.)是第一組,\\1是\1,代表第一組,也就是復用,+號代表依次或多次
“ ”以空格切
“#”以#號切
如果字元串中有多個空格“ +”,多個空格
8.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);
("(.)\\1+", "$1") $1是用第一個參數的第一組數據,$是引用上一參數
這樣可以將多個t和6個m換成一個
("(\\d{3})\\d{4}(\\d{4})", "$1****$2")保留電話號碼的頭和尾,中間我直接用4個*號代替就好了
(\\d{3})將數字重覆三次並且把它放在第一組裡面
8.4 獲取
將字元串中三個字元的單詞找出來
String str = "da 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());
}
"\\b[a-z]{3}\\b", \\b代表字元邊界 ,[a-z]{3}代表三個小寫字母
獲取的三個步驟
九、正則表達式實例
* 1,治療口吃:我我...我我...我我我要...要要要要...要要要要..學學學學學...學學編編...編編編編..編..程程...程程...程程程
* 2,對ip地址排序。
* 3,對郵件地址校驗。
9.1 治療口吃
String str = "我我...我我...我我我要...要要要要...要要要要..學學學學學...學學編編...編編編編..編..程程...程程...程程程";
//1,將字元串中.去掉。 用替換。
str = str.replaceAll("\\.+", "");
System.out.println(str);
//2,替換疊詞。
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
9.2 對ip地址排序
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//1,為了讓ip可以按照字元串順序比較,只要讓ip的每一段的位數相同。
//所以,補零,按照每一位所需做多0進行補充。每一段都加兩個0.
ip_str = ip_str.replaceAll("(\\d+)", "00$1");
System.out.println(ip_str);
//然後每一段保留數字3位。
ip_str = ip_str.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip_str);
//1,將ip地址切出。
String[] ips = ip_str.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for(String ip : ips){
// System.out.println(ip);
ts.add(ip);
}
for(String ip : ts){
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
9.3 郵件地址校驗
String mail = "[email protected]";
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3})+";
regex = "\\w+@\\w+(\\.\\w+)+";//[email protected]
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);