---------- 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/