正則表達式
1.正則表達式的優點和用途?
一種強大而靈活的文本處理工具;
大部分編程語言 、數據庫、文本編輯器、開發環境都支持正則表達式。
2.正則表達式定義:
正如他的名字同樣是描述了一個規則,經過這個規則能夠匹配一類字符串。
java
3.正則表達式語法正則表達式
(1)普通字符
字母、數字、漢字、下劃線、以及沒有特殊定義的標點符號,都是「普通字符」。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。
(2)簡單的轉義字符數據庫
\n | 表明換行符 |
\t | 製表符 |
\\ | 表明\自己 |
\^ ,\$,\.,\(, \) , \{, \} , \? , \+ , \* ,\| ,\[, \] | 匹配這些字符自己 |
(3)標準字符集合編程
注意區分大小寫,大寫是相反的意思網絡
\d | 任意一個數字,0~9 中的任意一個 |
\w | 任意一個字母或數字或下劃線,也就是 A~Z,a~z,0~9,_ 中任意一個 |
\s | 包括空格、製表符、換行符等空白字符的其中任意一個 |
. | 小數點能夠匹配任意一個字符(除了換行符)若是要匹配包括「\n」在內的全部字符,通常用[\s\S] |
(4)自定義字符集合app
[ ]方括號匹配方式,可以匹配方括號中任意一個字符編程語言
正則表達式的特殊符號,被包含到中括號中,則失去特殊意義,除了^,-以外。
標準字符集合,除小數點外,若是被包含於中括號,自定義字符集合將包含該集合。好比:[\d.\-+]將匹配:數字、小數點、+、-編輯器
[ab5@] | 匹配 "a" 或 "b" 或 "5" 或 "@" |
[^ abc] | 匹配 "a","b","c" 以外的任意一個字符 |
[f-k] | 匹配 "f"~"k" 之間的任意一個字母 |
[^A-F0-3] | 匹配 "A"~"F","0"~"3" 以外的任意一個字符 |
(5)量詞:修飾匹配次數的特殊符號ide
匹配次數中的貪婪模式(匹配字符越多越好,默認!)
匹配次數中的非貪婪模式(匹配字符越少越好,修飾匹配次數的特殊符號後再加上一個 "?" 號)工具
{n} | 表達式重複n次 |
{m,n} | 表達式至少重複m次,最多重複n次 |
{m,} | 表達式至少重複m次 |
? | 匹配表達式0次或者1次,至關於 {0,1} |
+ | 表達式至少出現1次,至關於 {1,} |
* | 表達式不出現或出現任意次,至關於 {0,} |
(6)字符邊界
^ | 與字符串開始的地方匹配 |
$ | 與字符串結束的地方匹配 |
\b | 匹配一個單詞邊界 |
正則表達式匹配模式:
匹配時忽略大小寫。
默認狀況下,正則表達式是要區分大小寫的。
整個文本看做一個字符串,只有一個開頭,一個結尾。
使小數點 "." 能夠匹配包含換行符(\n)在內的任意字符。
每行都是一個字符串,都有開頭和結尾。
在指定了 MULTILINE 以後,若是須要僅匹配字符串開始和結束位置,可使用 \A 和 \Z
(7)選擇符和分組
表達式 | 做用 |
|分支結構 | 左右兩邊表達式之間 "或" 關係,匹配左邊或者右邊 |
( )捕獲組 | (1). 在被修飾匹配次數的時候,括號中的表達式能夠做爲總體被修飾 (2). 取匹配結果的時候,括號中的表達式匹配到的內容能夠被單獨獲得 (3). 每一對括號會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。捕獲元素編號爲零的第一個捕獲是由整個正則表達式模式 匹配的文本 |
(?:Expression)非捕獲組 | 一些表達式中,不得不使用( ),但又不須要保存( )中子表達式匹 配的內容,這時能夠用非捕獲組來抵消使用( )帶來的反作用。 |
反向引用(\nnn):
每一對()會分配一個編號,使用 () 的捕獲根據左括號的順序從 1 開始自動編號。
經過反向引用,能夠對分組已捕獲的字符串進行引用。
(8) 預搜索(零寬斷言)
只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度
這個位置應該符合某個條件。判斷當前位置的先後字符,是否符合指定的條件,但不匹配先後的字符。是對位置的匹配。
正則表達式匹配過程當中,若是子表達式匹配到的是字符內容,而非位置,並被保存到最終的匹配結果中,那麼就認爲這個子表達式是佔有字符的;若是子表達式匹配的僅僅是位置,或者匹配的內容並不保存到最終的匹配結果中,那麼就認爲這個子表達式是 零寬度 的。佔有字符仍是零寬度,是針對匹配的內容是否保存到最終的匹配結果中而言的。
(?=exp) | 斷言自身出現的位置的後面能匹配表達式exp |
(?<=exp) | 斷言自身出現的位置的前面能匹配表達式exp |
(?!exp) | 斷言此位置的後面不能匹配表達式exp |
(?<!exp) | 斷言此位置的前面不能匹配表達式exp |
4.經常使用的正則表達式列表
匹配中文字符 | [\u4e00-\u9fa5] |
匹配空白行 | \n\s*\r |
匹配HTML標記 | <(\S*?)[^>]*>.*?</\1>|<.*? /> |
匹配首尾空白字符 | ^\s*|\s*$ |
匹配Email地址 | \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* |
匹配網址URL | [a-zA-z]+://[^\s]* |
匹配國內電話號碼 | \d{3}-\d{8}|\d{4}-\d{7} |
匹配騰訊QQ號 | [1-9][0-9]{4,} |
匹配中國郵政編碼 | [1-9]\d{5}(?!\d) |
匹配身份證 | \d{15}|\d{18} |
匹配ip地址 | \d+\.\d+\.\d+\.\d+ |
5.Java程序中使用正則表達式
相關類位於:java.util.regex包下面
類 Pattern:
正則表達式的編譯表示形式。
Pattern p = Pattern. compile(r,int) ; //創建正則表達式,並啓用相應模式
類 Matcher:
經過解釋 Pattern 對 character sequence 執行匹配操做的引擎
Matcher m = p.matcher(str); //匹配str字符串
public class Demo01 { public static void main(String[] args) { //表達式對象 Pattern p = Pattern.compile("\\w+"); //建立Matcher對象 Matcher m = p.matcher("asfsdf&23323"); boolean flag = m.matches(); //嘗試將整個字符序列與該模式匹配 boolean flag2 = m.find(); //該方法掃描輸入的序列,查找與該模式匹配的下一個子序列 String str = m.group(); //返回找到的字符串 String newStr = m.replaceAll("#");///替換 String str2 = "asds234adsa23sdsf"; String[] arrs = str2.split("\\d+"); System.out.println(Arrays.toString(arrs)); } }
6.簡單網絡爬蟲 如:weget
/** * 簡單網絡爬蟲 * @author MA * */ public class WebSpiderTest { public static String getURLContent(String urlStr,String charSet) throws IOException{ StringBuilder sb = new StringBuilder(); try { URL url = new URL(urlStr); BufferedReader reader =new BufferedReader(new InputStreamReader(url.openStream(),Charset.forName(charSet))); String temp = ""; while((temp=reader.readLine())!=null){ //System.out.println(temp); sb.append(temp); } } catch (MalformedURLException e) { e.printStackTrace(); } return sb.toString(); } public static List<String> getMatherSubstrs(String destStr,String regexStr){ //Pattern p = Pattern.compile("<a[\\s\\S]+?</a>");//取到超連接整個內容 Pattern p = Pattern.compile(regexStr);//取到超連接地址 Matcher m = p.matcher(destStr); List<String> result =new ArrayList<String>(); while(m.find()){ result.add(m.group(1)); } return result; } public static void main(String[] args) throws Exception { String destStr = getURLContent("http://www.163.com","gbk"); List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\""); for(String temp : result){ System.out.println(temp); } } }