正則表達式&&Java文本復雜操作


正則表達式
1.正則表達式的優勢和用途?
  一種強大而靈活的文本處理工具;
  大部分編程語言 、數據庫、文本編輯器、開發環境都支持正則表達式。
2.正則表達式定義:
  正如他的名字一樣是描述了一個規則,通過這個規則可以匹配一類字符串。

3.正則表達式語法

(1)普通字符
  字母、數字、漢字、下划線、以及沒有特殊定義的標點符號,都是“普通字符”。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。
(2)簡單的轉義字符

\n 代表換行符
\t 制表符
\\ 代表\本身
\^ ,\$,\.,\(, \) , \{, \} , \? , \+ , \* ,\| ,\[, \] 匹配這些字符本身

(3)標准字符集合

  注意區分大小寫,大寫是相反的意思

\d  任意一個數字,0~9 中的任意一個
\w 任意一個字母或數字或下划線,也就是 A~Z,a~z,0~9,_ 中任意一個
\s 包括空格、制表符、換行符等空白字符的其中任意一個
. 小數點可以匹配任意一個字符(除了換行符)如果要匹配包括“\n”在內的所有字符,一般用[\s\S]

(4)自定義字符集合

  [ ]方括號匹配方式,能夠匹配方括號中任意一個字符

  正則表達式的特殊符號,被包含到中括號中,則失去特殊意義,除了^,-之外。
  標准字符集合,除小數點外,如果被包含於中括號,自定義字符集合將包含該集合。比如:[\d.\-+]將匹配:數字、小數點、+、-

[ab5@] 匹配 "a" 或 "b" 或 "5" 或 "@"
[^ abc] 匹配 "a","b","c" 之外的任意一個字符
[f-k] 匹配 "f"~"k" 之間的任意一個字母
[^A-F0-3] 匹配 "A"~"F","0"~"3" 之外的任意一個字符

(5)量詞:修飾匹配次數的特殊符號

  匹配次數中的貪婪模式(匹配字符越多越好,默認!)
   匹配次數中的非貪婪模式(匹配字符越少越好,修飾匹配次數的特殊符號后再加上一個 "?" 號)

{n} 表達式重復n次
{m,n} 表達式至少重復m次,最多重復n次
{m,}  表達式至少重復m次
? 匹配表達式0次或者1次,相當於 {0,1}
+ 表達式至少出現1次,相當於 {1,}
* 表達式不出現或出現任意次,相當於 {0,}

(6)字符邊界

^ 與字符串開始的地方匹配
$ 與字符串結束的地方匹配
\b 匹配一個單詞邊界

正則表達式匹配模式:

  • IGNORECASE 忽略大小寫模式

    匹配時忽略大小寫。

     默認情況下,正則表達式是要區分大小寫的。

  • SINGLELINE 單行模式

    整個文本看作一個字符串,只有一個開頭,一個結尾。
    使小數點 "." 可以匹配包含換行符(\n)在內的任意字符。

  • MULTILINE 多行模式

    每行都是一個字符串,都有開頭和結尾。
     在指定了 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);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM