天天看點

黑馬程式員:正規表達式

----------   android教育訓練、java教育訓練、期待與您交流! ----------

正規表達式通俗的來講就是符合一個規則的表達式。可以通過正規表達式在字元串中查找出來符合這些規則的内容。

作用:用于專門操作字元串。

特點:用于一些特定的符号來表示一些代碼操作。這樣就簡化書寫。

是以學習正規表達式,就是在學習一些特殊符号的使用。

好處:可以簡化對字元串的複雜操作。

弊端:符号定義越多,正則越長,閱讀性越差。

正規表達式的主要用在以下四塊:

1,比對:String  matches方法。用規則比對整個字元串,隻要有一處不符合規則,就比對結束,傳回false。       

2,切割:String split()方法。

3,替換:String replaceAll(regex,str);如果regex中有定義組,可以在第二參數中通過$符号擷取正規表達式中的已有的組。

4,擷取:将字元串中的符合規則的子串取出。

較為常見的正規表達式的構造:

字元類

[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 次

Logical運算符

XY X 後跟 Y

X|Y X 或 Y

(X) X,作為捕獲組

Back 引用

\n 任何比對的 nth捕獲組

這些正規表達式的用法舉例:

1.比對:String  matches方法。用規則比對整個字元串,隻要有一處不符合規則,就比對結束,傳回false。       

驗證手機号碼:13xxxx,15xxxx,18xxxx

String tel = "13900001111";
String telReg = "1[358]\\d{9}";//1[358]第一位是1,第二位是3或5或8,\\d{9}是\d先用\轉義以後的數字剛好9位
System.out.println(tel.matches(telReg));
           

驗證郵箱是否合格:

String mailReg = "\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}|\\w+";
boolean falg = mail.matches(mailReg);
           

2.切割:String split()方法

public static void main(String[] args) 
{
	splitDemo("zhangsan.lisi.wangwu","\\.");
	splitDemo("c:\\abc\\a.txt","\\\\");
	splitDemo("erkktyqqquizzzzzo","(.)\\1+");//按照疊詞完成切割。為了可以讓規則的結果被重用
					//可以将規則封裝成一個組。用()完成。組的出現都有編号。
					//從1開始。 想要使用已有的組可以通過  \n(n就是組的編号)的形式來擷取。			
	}	
public static void splitDemo(String str,String reg)
{
	String[] arr = str.split(reg);  
	System.out.println(arr.length);
	for(String s : arr)
	{
		System.out.println(s);
	}
}
           

3.替換:String replaceAll(regex,str);如果regex中有定義組,可以在第二參數中通過$符号擷取正規表達式中的已有的組。

public static void main(String[] args) 
{
	String str = "wer1389980000ty1234564uiod234345675f";//将字元串中的數組替換成#。
	replaceAllDemo(str,"\\d{5,}","#");//将疊詞替換成#
	String str1 = "erkktyqqquizzzzzo"; //将重疊的字元替換成單個字母。zzzz->z
	replaceAllDemo(str1,"(.)\\1+","$1");	//$1代表的是已經封裝好的組的内容
}
public static void replaceAllDemo(String str,String reg,String newStr)
{
	str = str.replaceAll(reg,newStr);
	System.out.println(str);
}
           

4.擷取:将字元串中的符合規則的子串取出。

操作步驟:

1,将正規表達式封裝成對象。

2,讓正則對象和要操作的字元串相關聯。

3,關聯後,擷取正則比對引擎。

4,通過引擎對符合規則的子串進行操作,比如取出。

public static void main(String[] args) 
	{
		getDemo();
	}
	public static void getDemo()
	{
		String str = "ming tian jiu yao fang jia le ,da jia。";
		System.out.println(str);
		String reg = "\\b[a-z]{4}\\b";
		//将規則封裝成對象。
		Pattern p = Pattern.compile(reg);
		//讓正則對象和要作用的字元串相關聯。擷取比對器對象。
		Matcher m  = p.matcher(str);
		//System.out.println(m.matches());//其實String類中的matches方法。用的就是Pattern和Matcher對象來完成的。
		//隻不過被String的方法封裝後,用起來較為簡單。但是功能卻單一。
		while(m.find())
		{
			System.out.println(m.group());
			System.out.println(m.start()+"...."+m.end());
		}
	}
           

練習:網絡爬蟲

/*
網頁爬蟲(蜘蛛),擷取自己索要的資訊
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2 
{
	public static void main(String[] args) throws Exception
	{
		getMails_1();
	}
	/*
	獲得指定網頁頁面裡的郵箱資訊
	*/

	public static void getMails_1()throws Exception
	{
		URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");//使用URL對象擷取位址資訊
		URLConnection conn = url.openConnection();//打開位址
		BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));//獲得指定頁面的流對象
		String line = null;
		String mailreg = "\\w+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(mailreg);
		while((line=bufIn.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
	}

	/*
	擷取指定文檔中的郵件位址。
	使用擷取功能。Pattern  Matcher
	*/
	public static void getMails()throws Exception
	{
		BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));
		String line = null;
		String mailreg = "\\w+@\\w+(\\.\\w+)+";
		Pattern p = Pattern.compile(mailreg);
		while((line=bufr.readLine())!=null)
		{
			Matcher m = p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
	}
}
           

----------   android教育訓練、java教育訓練、期待與您交流! ----------

詳情請檢視:http://edu.csdn.net/heima/