正則表達式:符合一定規則的表達式,它用於操作字符串,這樣就簡化對字符串的複雜操作。不過符號定義越多,正則越長,閱讀性就會越差。
字符類
[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]
"."是正則表達式裏面的符號。它代表任意字符。所以,當想要用正常的.來切割的時候,就需要對正則表達式中的.進行轉義。也就是\.,它代表了規則中的正常的點,當放進字符串中的時候,還需要對 \ 進行轉義。即:\\
Greedy 數量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過m 次
邊界匹配器
^ 行的開頭
$ 行的結尾
\b 單詞邊界
\B 非單詞邊界
\A 輸入的開頭
\G 上一個匹配的結尾
\Z 輸入的結尾,僅用於最後的結束符(如果有的話)
\z 輸入的結尾
組
當想要對一個規則的結果進行重用,可以把這個規則封裝成組,裝進()中,這樣這個組裏的結果就可以重用。組從第一組開始標號。通過\N(n就是組的編號)的形式來表示捕獲的組的內容,即表示當前這位上的規則要使用的規則就是那一組的規則的結果的重用。
Eg:
規則(.)\1中表示第一位是任意字符,第二位是對第一位的結果的重用。當把這個規則封裝進String中時,要對\進行轉義。即:"(.)\\1"
怎麼看分辨組:一對括弧一組。按照括弧的順序對組從1開始編號。
$的用法
【通過$n可以獲取到前面的規則中的第N組的結果。】
eg:
replaceAllDemo(Str,"(.)\\1+","$1").$1表示獲取(.)這個組的結果來使用。
具體操作功能
1.匹配:
String類中的matches(regex)方法,用規則匹配字符串,只要有一處不符合規則就匹配結束,返回false
2.切割:
String類中的split(Stringregex)方法,根據給定正則表達式的匹配拆分此字符串。
3.替換
String類中的replaceAll(Stringregex, String replacement)方法,使用給定的replacement 替換此字符串所有匹配給定的正則表達式的子字符串。
4.獲取
將字符串中符合規則的子串取出
1.把正則封裝成pattern對象.staticPattern compile(String regex)
2.把正則對象和字符串關聯
3.在匹配器中查找符合規則的字符串
4.取出這個字符串
①.Pattern類
static Pattern compile(String regex)將給定的正則表達式編譯到模式中。
Matcher matcher(CharSequence input) 創建匹配給定輸入與此模式的匹配器。
②.Matcher類
匹配器:同一個匹配器中使用同一個索引
通過解釋 Pattern對 charactersequence 執行匹配操作的引擎。通過調用模式的 matcher方法從模式創建匹配器。
創建匹配器後,可以使用它執行三種不同的匹配操作:
matches 方法嘗試將整個輸入序列與該模式匹配。
lookingAt 嘗試將輸入序列從頭開始與該模式匹配。
find 方法掃描輸入序列以查找與該模式匹配的下一個子序列。每個方法都返回一個表示成功或失敗的布爾值。通過查詢匹配器的狀態可以獲取關於成功匹配的更多信息。
boolean find() 嘗試查找與該模式匹配的輸入序列的下一個子序列。
String group() 返回由以前匹配操作所匹配的輸入子序列。
得先找後獲取:
while(find())
{
group()
}
Eg:
String str="";
String regexstr="";
Pattern p =Pattern.compile(String regexstr)//創建正則對象
Matcher m = p.matcher(str);//字符串與正則對象關聯
while(m.fing())//查找
{
m.group();//取出
}
思路方式:
1,如果只想知道該字符是否對是錯,使用匹配。
2,想要將已有的字符串變成另一個字符串,替換。
3,想要按照自定的方式將字符串變成多個字符串。切割。獲取規則以外的子串。
4,想要拿到符合需求的字符串子串,獲取。獲取符合規則的子串。
實例:網頁爬蟲
/*
網頁爬蟲(蜘蛛)
*/
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.112:8080/myweb/mail.html");
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());
}
}
}
}