正則表達式的匹配,替換和切割

/*
 * 正則表達式:符合一定規則的表達式
 * 		作用:用於專門操作字符串
 * 		特點:用一些特定的符號來表示代碼的操作,簡化書寫
 * 			所以學習正則表達式就是學習一些特定的符號的使用
 * 		好處:可以簡化對字符串的複雜操作
 * 		弊端:符號定義越多,正則越長,閱讀性越差
 * 
 * 具體操作功能:
 * 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

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