Java 正則表達式處理複雜文本,效率就是高!

點擊關注公衆號,Java乾貨及時送達

一、正則表達式簡介

1.爲什麼需要正則表達式?

  • 文本的複雜處理

2.正則表達式的優勢和用途?

  • 一種強大而靈活的文本處理工具;
  • 大部分編程語言,數據庫,文本編輯器,開發環境都支持正則表達式

3.正則表達式定義:

  • 正如它的名字一樣是描述一個規則,通過這個規則可以匹配一類字符串
  • 學習正則表達式很大程度上就是學習正則表達式的語法規則

二、開發中如何使用?

開發中使用正則表達式的流程:

三、正則表達式語法

普通語法

字母,數字,漢字,下劃線,以及沒有特殊定義的標點符號,都是普通字符.

表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符

簡單的轉義字符

標準字符集合

能夠與'多種字符'匹配的表達式

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

自定義字符集合

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

正則表達式的特殊符號,被包含到中括號中,則失去特殊意義,除了^和-之外

標準字符集合, 除了小數點外,如果被包含於中括號,自定義字符集合將包含該集合

比如: [\d.- +]將匹配 數字,小數點,+ ,-

量詞(Quantifier)

修飾匹配次數的特殊符號

\d{6} 重複6次       \d\d{6}重複7次      (\d\d){6}重複12次

\d{1,6}  匹配連續1~6次數字 ,從6開始匹配,貪婪模式

\d{1,6}?  匹配連續1~6次數字 ,從1開始匹配,非貪婪模式

\d{4,}   匹配連續 4個數字以上

匹配次數中的貪婪模式(匹配字符越多越好,默認)

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

字符邊界

本組標記匹配的不是字符而是位置,符號某種條件的位置-----------零寬

\b匹配這樣一個位置: 前面的字符和後面的字符不全是\w

正則表達式的匹配模式

IGNORECASE 忽略大小寫模式

匹配時忽略大小寫

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

SINGLELINE  單行模式

整個文本看作一個字符串,只有一個開頭,一個結尾

使小數點"."可以匹配包含換行符(\n)在內的任意字符

MULTILINE  多行模式

每行都是一個字符串,都有開頭和結尾

在指定了MULTILINE之後,如果需要僅匹配字符串開始和結束位置,可以使用\A和\Z

最新 Java 核心技術教程,都在這了!

選擇符和分組

反向引用(\nnn)

每一對()會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號

通過反向引用,可以對分組已捕獲的字符串進行引用

預搜索(零寬斷言)

只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度

這個位置應該符合某個條件.判斷當前位置的前後字符,是否符合指定的條件,但不匹配前後的字符.是對位置的匹配

正則表達式匹配過程中,如果子表達式匹配到的是字符內容,而非位置,並被保存到最終的匹配結果中,那麼就認爲這個子表達式是佔有字符的;如果子表達式匹配的僅僅是位置,或者匹配的內容並不保存到最終的匹配結果中,那麼就認爲這個子表達式是零寬的.佔有字符還是零寬度,是針對匹配的內容是否保存到最終的匹配結果中而言的

四、電話號碼驗證

五、電子郵件地址驗證

常用正則表達式列表

六、Java 使用正則表達式

  • 相關類位於: java.util.regex包下
  • 類Pattern:

正則表達式的編譯表達形式

Pattern p = Patttern.compile(r,int); //建立正則表達式,並啓動相應模式

  • 類Matcher:

通過解釋Pattern對character sequence 執行匹配操作的引擎

Matcher m = p.matcher(str); //匹配str字符串

/*
* 測試正則表達式的基本用法
* */
public class Demo01 {
    public static void main(String[] args) {
        //在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
        //表達式對象
                   Pattern p = Pattern.compile("\\w+");
        //創建Matcher對象
                   Matcher m = p.matcher("asfsd&&23323");
        boolean result = m.matches(); //嘗試將整個字符序列與該模式匹配
                  System.out.println(result);
        //該方法掃描輸入的序列,查找與該模式匹配的下一個子序列
                 boolean result2 = m.find();
        System.out.println(result2);
        System.out.println(m.group());
        while (m.find()) {
            System.out.println(m.group());  //group(),group(0)匹配整個表達式的子字符串
                           System.out.println(m.group(0));
        }
    }
}
/*
* 測試正則表達式對象中分組的處理
* */
public class Demo02 {
    public static void main(String[] args) {
        //在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
        //表達式對象
                    Pattern p = Pattern.compile("([a-z]+)([0-9]+)");
        //創建Matcher對象
                   Matcher m = p.matcher("aa232*ssd445*sds223");
        while (m.find()) {
            System.out.println(m.group(0));//匹配到整個表達式的子字符串內容
                           System.out.println(m.group(1));//匹配到第一個表達式的內容
                           System.out.println(m.group(2));//匹配到第二個表達式的內容
                   }
    }
}
/*
* 測試正則表達式對象的替換操作
* */
public class Demo03 {
    public static void main(String[] args) {
        //在這個字符串:asfsd23323,是否符合指定的正則表達式:\w+
        //表達式對象
                   Pattern p = Pattern.compile("[0-9]");
        //創建Matcher對象
                    Matcher m = p.matcher("aa232*ssd445*sds223");
        //替換
                   String newStr =m.replaceAll("#");
        System.out.println(newStr);
    }
}
/*
* 測試正則表達式對象的分割字符串操作
* */
public class Demo04 {
    public static void main(String[] args) {
        String str = "a,b,c";
        String[] arrs = str.split(",");
        System.out.println(Arrays.toString(arrs));
        String str2 = "a232b4334c3434";
        String[] arrs2 = str2.split("\\d+");
        System.out.println(Arrays.toString(arrs2));
    }
}
/*
* 網絡爬蟲取鏈接
* */
public class WebSpiderTest {
    /*
    * 獲得urlStr對應的網頁的源碼
    * */
    public static String getURLContent(String urlStr,String charset) {
        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) {
                sb.append(temp);
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sb.toString();
    }
    public static List<String> getMatherSubstrs(String destStr, String regexStr) {
        Pattern p = Pattern.compile(regexStr);
        Matcher m = p.matcher(destStr);
        List<String> list = new ArrayList<>();
        while (m.find()) {
            list.add(m.group(1));
        }
        return list;
    }
    public static void main(String[] args) {
        String destStr = getURLContent("http://www.163.com/","gbk");
        //Pattern p = Pattern.compile("<a[\\s\\S]+?</a>"); //取到的超鏈接的整個內容
                 //Pattern p = Pattern.compile("href=\"(.+?)\""); //取到的超鏈接的地址
                   List<String> result = getMatherSubstrs(destStr, "href=\"([\\w\\s./:]+?)\"");
        for (String str:result) {
            System.out.println(str);
        }
    }
}

最後,關注公衆號Java技術棧,在後臺回覆:面試,可以獲取我整理的 Java 系列面試題和答案,非常齊全。

原文鏈接:https://blog.csdn.net/yuyinghe0612/article/details/80559979

版權聲明:本文爲CSDN博主「yuyinghe0612」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。






關注Java技術棧看更多幹貨



獲取 Spring Boot 實戰筆記!

本文分享自微信公衆號 - Java技術棧(javastack)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章