/*
* 正則表達式:符合一定規則的表達式
* 作用:用於專門操作字符串
* 特點:用一些特定的符號來表示代碼的操作,簡化書寫
* 所以學習正則表達式就是學習一些特定的符號的使用
* 好處:可以簡化對字符串的複雜操作
* 弊端:符號定義越多,正則越長,閱讀性越差
*
* 具體操作功能:
* 1.匹配:String類中的matches()方法
* matches(String regex) 告知此字符串是否匹配給定的正則表達式。返回boolean類型的值
* matches()方法用規則匹配整個字符串,只要有一處不符合規則,就匹配結束,返回false
*
* 2.切割:String類中的split()方法
* 注意切割的時候儘量不要用正則表達式定義的特殊符號
* 如果要用則要轉義一下,變成這樣\\.因爲如果只是".",它表示任意字符,如果用它切沒有意義
*
* 3.替換:replaceAll()方法,還有replaceFirst()方法(此處沒有列用法)
*/
package 類;
public class 正則表達式 {
public static void main(String[] args) {
// TODO Auto-generated method stub
正則表達式 d = new 正則表達式();
String str = "as12we344w542404y44333ew56djhsddog1424405isd3140465jfksgh40444445adbcja45gd";
//把字符串中所有的數字都替換成#
d.replaceAllDemo(str,"\\d","#");
//把字符串中連續超過5個的替換成一個#
d.replaceAllDemo(str,"\\d{5,}","#");
//將字符串中的疊詞替換成#
String str1 = "asaaaafsgdkfaaaakdfgkkdfgjjsdfgdgg";
//兩個相同的替換成一個#
d.replaceAllDemo(str1,"(.)\\1","#");
//相同單詞長度超過1的都替換一個#
d.replaceAllDemo(str1,"(.)\\1+","#");
//將字符串中的疊詞替換成單個的字母;例如:zzzz-->z;zz-->z;zzz-->z
//通過另外一個規則($1)獲取組中的元素
d.replaceAllDemo(str1,"(.)\\1+","$1");
/*
* 切割字符串,按照多種對應字符切割
* 下面代碼提供了多種切割規則
* 除了需要轉義的特殊字符,其他的字符采用相同的方式進行切割
* 例如可以把下面的逗號改成空格得到的結果相同
*/
//按照多個"\\"來切割
//注意如果表示"\"要用兩個"\\"
//"\\\\"表示兩個"\\"
d.splitDemo("c\\abc\\\\\\aa.txt","\\\\+");
//按照多個點.來切割字符串
d.splitDemo("天.真...無.....邪","\\.+");
//按照多個逗號來進行切割
d.splitDemo("天,真,,,,無,,,,,,,,,,,,邪",",+");
//按照一個逗號來進行切割
d.splitDemo("天,真,無,邪",",+");
/*
* 按照疊詞切割字符串(疊詞:前一個字符和後面一個相同,例如:aa,kk)
* 切割規則:
* 第二位要用第一位的結果,即第二位是第一位字符的再一次出現
* 第一位的結果被第二位重用
* 爲了讓規則的結果被重用,可以將規則封裝成一個組,用()完成
* 組的出現都有編號,從1開始,
* 想要使用已有的組可以通過\n(n就是組的編號)的形式來獲取
* 此時就表明第二位的結果和第一位一致
*
* ((())())像這種特殊的情況要判斷有幾組只需要判斷有幾個左括號
* 此時這種情況有四組,判斷是第幾組從左到右,第一個左括號是第一組,第二個左括號是第二組
* 依次類推即可(注意看JDK幫助文檔)
*/
/*
* 注意:如果三個相同或者五個相同的在一塊,則按照前面兩個進行切割
* 如果說所有的相同的在一塊都用來切割,在\\1後面加上一個加號
*/
d.splitDemo("sfaalkkdsffgjaaadodigssd", "(.)\\1");
d.splitDemo("sfaalkkkdsffgjaaadodigssdaffffghdfffffd", "(.)\\1+");
/*
* 如果說全部相同的時候,注意輸出結果
* 如果相同的字符的個數是偶數,輸出結果爲0,這種情況沒有意義
* 如果爲奇數,會輸出一大堆爲空的字符串,由切割次數控制
*/
d.splitDemo("aaaaaaaaaaaaaaaaa", "(.)\\1");
d.splitDemo("aaaaaaaaaaaaaaaaa", "(.)\\1+");
//匹配手機號碼
d.Tel();
//匹配QQ號碼
d.QQ();
//匹配郵箱
d.Email();
}
/*
* 第一個字符串是要替換的內容
* 第二個字符串是替換的規則
* 第三個字符串是用來替換的內容
*/
public void replaceAllDemo(String str,String strReg,String newStr) {
str = str.replaceAll(strReg, newStr);
System.out.println("替換以後的字符串變爲 : " + str);
}
public void splitDemo(String str,String strReg) {
//切割完以後返回的是String數組
String []arr = str.split(strReg);
//查看切割以後字符串的數量
System.out.println("切割以後字符串的數量 : " + arr.length);
for(String i : arr)
System.out.print(i + "*");
System.out.println();
}
//匹配手機號
public void Tel() {
/*
* 定義規則如下:
* 手機號碼只能是11位,第一位只能是1,第二位可以是3,5,7;
* 後面9位可以是0-9的任意一個數字
*/
String tel = "13254687601";
//{9}表示\\d正好出現9次
String telReg = "1[357]\\d{9}";
System.out.println("驗證電話 : " + tel.matches(telReg));
}
public void QQ() {
/*
* 定義規則如下:
* 第一位不能是0,QQ號碼的長度是6-15位;
* 除第一位以外的位可以是0-9的任意一個數字
*/
String qq = "1367387530";
//{5,14}表示\\d出現的次數在5-14之間
String qqReg = "[1-9]\\d{5,14}";
System.out.println("驗證QQ : " + qq.matches(qqReg));
}
public void Email() {
/*
* 定義規則如下:
* [email protected]
* 如上面這種形式,@前面的位數在5-15之間,爲大寫字母小寫字母和數字三種形式;
* @後面.前面的位數在2-3位之間,只能是qq或者163;
* .後面的爲com,而且只能是com
*/
String email = "[email protected]";
String []emialReg = {"\\w{5,15}[email protected]","\\w{5,15}[email protected]"};
boolean flag = email.matches(emialReg[0]);
//如果不是163郵箱,則繼續驗證是否是qq郵箱
if(flag == false)
flag = email.matches(emialReg[1]) ? true : false;
System.out.println("驗證郵箱 : " + flag);
}
}
替換以後的字符串變爲 : as##we###w######y#####ew##djhsddog#######isd#######jfksgh########adbcja##gd
替換以後的字符串變爲 : as12we344w#y#ew56djhsddog#isd#jfksgh#adbcja45gd
替換以後的字符串變爲 : as##fsgdkf##kdfg#dfg#sdfgd#
替換以後的字符串變爲 : as#fsgdkf#kdfg#dfg#sdfgd#
替換以後的字符串變爲 : asafsgdkfakdfgkdfgjsdfgdg
切割以後字符串的數量 : 3
c*abc*aa.txt*
切割以後字符串的數量 : 4
天*真*無*邪*
切割以後字符串的數量 : 4
天*真*無*邪*
切割以後字符串的數量 : 4
天*真*無*邪*
切割以後字符串的數量 : 6
sf*l*ds*gj*adodig*d*
切割以後字符串的數量 : 8
sf*l*ds*gj*dodig*da*ghd*d*
切割以後字符串的數量 : 9
********a*
切割以後字符串的數量 : 0
驗證電話 : true
驗證QQ : true
驗證郵箱 : true