最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaSE正則表達式用法總結大全

 更新時間:2025年06月28日 14:01:21   作者:會點吉他的程序員  
正則表達式就是由一些特定的字符組成,代表的是一個規(guī)則,這篇文章主要介紹了JavaSE正則表達式用法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

常用的正則表達式匹配符

[A-Z] //匹配 A到Z任意一個字符

[a-z] //匹配 a到z任意一個字符

[0-9] //匹配 0到9任意一個數(shù)字

[^A-Z] //匹配 不是A到Z任意一個字符

[^a-z] //匹配 不是a到z任意一個字符

[^0-9] //匹配 不是0到9任意一個數(shù)字

[abcd] //匹配 abcd中的任意一個字符

abc   //匹配 abc字符串區(qū)分大小寫
    
(?i)abc //匹配 abc字符串不區(qū)分大小寫

a(?i)bc //匹配 abc字符串后面的bc不區(qū)分大小寫

a((?i)b)c //匹配 abc字符串中間的b不區(qū)分大小寫    
    
\\d //匹配數(shù)字字符,等價于 [0-9]。
    
\\D //匹配非數(shù)字字符,等價于 [^0-9]    

\\w //匹配字母、數(shù)字或下劃線,等價于 [a-zA-Z0-9_]
    
\\W //匹配非字母、數(shù)字或下劃線,等價于 [^a-zA-Z0-9_] 

\\s //匹配空白字符(包括空格、制表符、換行符等) 
    
\\S //匹配非空白字符(包括空格、制表符、換行符等)\s的反義   
    
. //匹配出\n外的任意字符,如果向匹配.字符本身,可以使用\\.   
    
| //選擇匹配符,例如 ab|bc 表示匹配ab或者bc的字符串
    
* //指定字符重復0次或n次(無要求)零到多 示例 (abc)* 匹配輸入 abc,abcabcabc

+ //指定字符重復1次或n次(至少一次) 示例 m+(abc)* 以至少1個m開頭,后接任意個abc的字符串  匹配輸入 m,mabc,mabcabc,mmabc 

? //指定字符重復0次或1次(最多一次) 示例 m+abc? 以至少一個m開頭,后接ab或者abc的字符串 匹配輸入 mab,mabc,mmmab,mmabc
    
{n} //只能輸入n個字符 [abcd]{3} 由abcd中字母組成的任意長度為3的字符串 匹配輸入 abc,dbc,adc    

{n,} //指定至少n個匹配 示例 [abcd]{3,} 說明:由abcd中字母組成的任意長度不小于3的字符串

{n,m} //指定至少n個但不多于m個匹配 示例 [abcd]{3,5} 說明:由abcd中字母組成的任意長度不小于3,不大于5的字符串

^ //指定起始字符 示例 ^[0-9]+[a-z]* 說明:以至少1個數(shù)字開頭,后接任意個小寫字母的字符串 匹配輸入:123,6aa,555edf
    
$ //指定結束符 示例 ^[0-9]\\-[a-z]+$ 說明:以1個數(shù)字開頭后連接字符 "-" ,并以至少1個小寫字母結尾的字符串 匹配輸入:1-a

\\b //匹配目標字符串的邊界 示例 han\\b 說明:這里說的字符串邊界指的是子串間有空格,或者是目標字符串的結束文字 匹配輸入:asfasdffate asdfafate   
    
\\B //匹配目標字符串的非邊界 示例 han\\B 說明:和\b的含義剛剛相反 匹配輸入:fateafadsfafa fateafadsfasdf    
    
(pattern) //非命名捕獲。捕獲匹配的子字符串,編號為零的第一個捕獲的是由整個正則表達式模式匹配的文本,其他捕獲結果則根據(jù)左括號的順序從1開始自動編號
    
(?<name> pattern) //命名捕獲。將匹配的子字符串捕獲到一個組名稱或編號名稱中,用于name的字符串不能包含任何標點符號,并且不能以數(shù)字開頭

(?:pattern) //匹配 pattern 但不捕獲該匹配的子表達式,即它是一個非捕獲匹配,不存儲供以后使用的匹配。這對于用“or”字符(||)組合模式部件的情況很有用。例如,'industr'(?:y|lies)是對‘industry|industries'更經(jīng)濟的表達式

(?=pattren) //它是一個非捕獲匹配。例如,‘Windows(?=95|98|NT|2000)'匹配“Windows 2000”中的"Windows",但不匹配“Windows 3.1”中的“Windows”

(?!pattren) //該表達式匹配不處于匹配 pattren 的字符串的起始點的搜索字符串。它是一個非捕獲匹配。例如,‘Windows(?!95|98|NT|2000)'匹配“Windows 3.1”中的"Windows",但不匹配“Windows 2000”中的“Windows”
    
//注意點:Java默認是遵循貪婪匹配的,比如一個字符串為 2009 編寫的正則表達式為 \\d+ 最后在程序執(zhí)行后 結果為 2009 (優(yōu)先匹配到數(shù)量多的 即2009)
//如果不想遵循貪婪匹配,可以在對應的正則表達式后添加?符號 例如 \\d+? 匹配上面的結果就為2 0 0 9
 
//當創(chuàng)建Pattern對象時,指定Pattern.CASE_INSENSITIVE,表示匹配字符串是不區(qū)分字母大小寫的
Pattern pattern = Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);    
//非命名分組和命名分組的代碼驗證
public class Test {
    public static void main(String[] args) {
        String str = "mioyuimugi1989fateafadsfasdf1999 ";
        //非命名分組
//        String regStr = "(\\d\\d)(\\d\\d)";//匹配連續(xù)的4個數(shù)字
        //命名分組
        String regStr = "(?<g1>\\d\\d)(?<g2>\\d\\d)";//匹配連續(xù)的4個數(shù)字
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(str);
        while(matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
            System.out.println("找到分組[1]="+matcher.group(1));
            System.out.println("找到分組[g1]="+matcher.group("g1"));
            System.out.println("找到分組[2]="+matcher.group(2));
            System.out.println("找到分組[g2]="+matcher.group("g2"));
        }
    }
}

運行結果截圖:

public class Test {
    public static void main(String[] args) {
        //非捕獲分組 (?:pattern) 代碼演示如下
        //不能使用 matcher.group(1)
        String str = "輕音少女2009 輕音少女2010 輕音少女2011";
        String regExp = "輕音少女(?:2009|2010|2011)";
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
        }
    }
}

運行結果截圖:

public class Test {
    public static void main(String[] args) {
        //非捕獲分組 (?!pattern) 代碼演示如下
        //不能使用 matcher.group(1)
        String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
        String regExp = "輕音少女(?!2009|2010|2011)";
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));//該模式下匹配到的是輕音少女2025
        }
    }
}

運行結果截圖:

public class Test {
    public static void main(String[] args) {
        //默認貪婪匹配和非貪婪匹配的區(qū)別和演示
        String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
        String regExp = "\\d+";//默認貪婪匹配
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(str);
        System.out.println("============================貪婪模式下匹配結果=========================");
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
        }
        regExp = "\\d+?";//改成了非貪婪匹配
        pattern = Pattern.compile(regExp);
        matcher = pattern.matcher(str);
        System.out.println("============================非貪婪模式下匹配結果=========================");
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
        }
    }
}

運行結果截圖:

public class Test {
    public static void main(String[] args) {
        //默認貪婪匹配和非貪婪匹配的區(qū)別和演示
        String str = "輕音少女2009 輕音少女2010 輕音少女2011 輕音少女2025";
        String regExp = "\\d*";//默認貪婪匹配
        Pattern pattern = Pattern.compile(regExp);
        Matcher matcher = pattern.matcher(str);
        System.out.println("============================貪婪模式下匹配結果=========================");
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
        }
        regExp = "\\d*?";//改成了非貪婪匹配
        pattern = Pattern.compile(regExp);
        matcher = pattern.matcher(str);
        System.out.println("============================非貪婪模式下匹配結果=========================");
        while (matcher.find()) {
            System.out.println("找到:"+matcher.group(0));
        }
    }
}

運行結果截圖:

正則表達式常用的類

java.util.regex 包主要包括以下三個類 Pattern類、Matcher類和PatternSyntaxException

Pattern類

  • Pattern對象時一個正則表達式對象,Pattern類沒有公共構造方法,要構建一個Pattern對象,需要調用其公共靜態(tài)方法,它返回一個Pattern對象,該方法結束一個正則表達式作為它的一個參數(shù),比如:Pattern p = Pattern.compile(pattern);

Matcher類

  • Mattcher對象時對輸入字符串進行解釋和匹配的引擎。與Pattern類一樣,Matcher也沒有公共構造方法,你需要調用Pattern對象的matcher方法來獲得一個Matcher對象

PatternSyntaxException類

  • PatternSyntaxException是一個非強制異常類,它表示一個正則表達式模式中的語法錯誤。

分組、捕獲、反向引用

分組

  • 我們可以用圓括號組成一個比較復雜的匹配模式,那么一個圓括號的部分我們可以看作一個子表達式/一個分組

捕獲

  • 把正則表達式中子表達式/分組匹配的內容,保存到內存中以數(shù)字編號或顯式命名的組里,方便后面引用,從左向右,以分組的左括號為標志,第一個出現(xiàn)的分組的組號為1,第二個為1,以此類推。組0代表的是整個正則式。

反向引用

  • 圓括號的內容被捕獲后,可以在這個括號后被使用,從而寫出一個比較實用的匹配模式,這個我們稱之為方向引用,這種引用即可以是在正則表達式內部,也可以是在正則表達式外部,內部反向引用\分組號,外部反向引用 $分組號。

反向引用題型案例

  • 要匹配兩個連續(xù)的相同的數(shù)字。

    String reg = "(\\d)\\1";
    
  • 要匹配五個連續(xù)的相同數(shù)字。

    String reg = "(\\d)\\1{4}";
    
  • 要匹配個位與千位相同,十位與百位相同的數(shù) 5225,1551。

    String reg = "(\\d)(\\d)\\2\\1";
    
  • 請在字符串中檢索商品編號,形式如:12321-333999111這樣的號碼,要求滿足前面是一個五位數(shù),然后一個-號,然后是一個九位數(shù),連續(xù)的每三位要相同。

    String reg = "\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}";
    

正則表達式應用實例

要求編寫符合下面要求格式的正則表達式

  • 漢字

    String regExp ="^[\\u4E00-\\u9FFF]+$";//注意編碼,該正則表達式是在UTF-8上實現(xiàn)的
    
  • 郵政編碼

    要求:是1-9開頭的一個六位數(shù)。比如:123890

    String regExp = "^[1-9]\\d{5}$";
    
  • QQ號碼

    要求:是1-9開頭的一個(5位數(shù)-10位數(shù))比如:12389,1345687,187698765

    String regExp = "^[1-9]\\d{4,9}$";
    
  • 手機號碼

    要求:必須以13,14,15,18 開頭的11位數(shù),比如 13588889999

    String regExp = "^1(?:3|4|5|8)\\d{9}$";
    
  • 檢查請求的url地址是否符合格式

    public class Test {
        public static void main(String[] args) {
            String url = "https://www.bilibili.com/video/BV1Eq4y1E79W?spm_id_from=333.788.player.switch&vd_source=008f4bb261040622b4b9810f1577d84a&p=17";
            /**
             * 思路:
             *      1,最前面的可能是 https:// 或http:// 或沒有 -> ((http|https)://)?
             *      2,中間www.bilibili.com 可以拆分成兩個部分 即 xxx. 和  后面的 xxx
             *         其中xxs包含的字符可能有數(shù)字,大小寫字母,下劃線和- 前后兩個部分都可能含有一個或多個 -> ([\\w-]\.)+([\\w-])+
             *      3, 最后的一個部分以/開頭,后面包含的字符可能有數(shù)字,下劃線,大小寫英語和一些特殊字符(包括?.#=-%&)
             */
            String regExp = "((http|https)://)?([\\w-]+\\.)+[\\w-]+(\\/[\\w-/?.#%&=]*)?";//注意當[.?]情況時.?符號匹配的就是本身
            Pattern pattern = Pattern.compile(regExp);
            Matcher matcher = pattern.matcher(url);
            if (matcher.find()) {
                System.out.println("滿足格式="+matcher.group(0));
            } else {
                System.out.println("不滿足格式");
            }
            //以下為整體匹配
            System.out.println(Pattern.matches(regExp,url));
        }
    }
    
    

    注意當[.?]情況時.?符號匹配的就是本身

運行結果截圖:

6. 經(jīng)典的結巴程序

  • 把類似:“我…我要…學學學學…編程java!”通過正則表達式 修改成"我要學編程java"

    public class RegExpDemo1 {
        public static void main(String[] args) {
            String content = "我....我要....學學學學....編程java!";
            System.out.println("content="+content);
            //1 去除所有的.  使用\\.
            String reg = "\\.";
            content = content.replaceAll(reg,"");
            System.out.println("content="+content);
            //2 (1) 找到所有的疊詞 (.)\\1+
            //  (2) 對找到的引用進行反向引用替換$1
            content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");
            //或者如下面一行代碼
            //content = content.replaceAll("(.)\\1+","$1");
            System.out.println("content="+content);
        }
    }
    

    運行結果截圖:

7. 將該"JDK1.3 JDK1.4"中的JDK1.3和JDK1.4全面替換成JDK

public class RegExpDemo1 {
public static void main(String[] args) {
    String content = "JDK1.3 JDK1.4";
    System.out.println("content="+content);
    content = content.replaceAll("(JDK)(?:1.3|1.4)","$1");
    System.out.println("content="+content);
}
}

運行結果截圖:

  • 驗證電子郵件格式是否合法(要求如下)

    只能有一個@

    @前面是用戶名,可以是a-z,A-Z,0-9 _字符

    @后面的是域名,并且域名只能是英語字母,比如sohu.com 或者tsinghua.org.cn

    寫出對應的正則表達式,驗證輸入的字符串是否滿足規(guī)則

    public class RegExpDemo1 {
        public static void main(String[] args) {
            //驗證郵箱格式是否正確
            //1. 只能有一個@
            //2. @前面是用戶名,可以是a-z,A-Z,0-9 _字符
            //3. @后面的是域名,并且域名只能是英語字母,比如sohu.com 或者tsinghua.org.cn
            String regExp = "^[\\w-]+@([a-zA-Z]+\\.)+[a-zA-Z]+$";//因為是進行匹配,建議將前后的定位符加上
            String emailStr = "1234_sss@tsinghua.org.cn";
            if (emailStr.matches(regExp)) {//該方法是進行整體匹配的
                System.out.println("該郵箱格式正確!"+emailStr);
            } else {
                System.out.println("該郵箱格式不正確!"+emailStr);
            }
        }
    }
    

    運行結果截圖:

  • 要求驗證是不是整數(shù)或者小數(shù)

    • 注意:該題要考慮正數(shù)和負數(shù) 比如:123 +123 -345 34.89 -87.9 -0.001 0.45 等 不符合要的數(shù)據(jù)實例 --123 ++123 0035 01.01
public class RegExpDemo1 {
    public static void main(String[] args) {
       //要求驗證是不是整數(shù)或者小數(shù)
        //注意:該題要考慮正數(shù)和負數(shù) 比如:123 -345 34.89 -87.9 -0.001 0.45 等
        String numStr = "+45";
        String regExp = "^[-+]?([1-9]\\d*|0)(\\.\\d+)?$";
        if (numStr.matches(regExp)) {
            System.out.println("匹配成功,是整數(shù)或小數(shù)!"+numStr);
        } else {
            System.out.println("匹配不成功,不是整數(shù)或小數(shù)!"+numStr);
        }
    }
}

運行結果截圖:

  • 對一個url進行解析 例如 https://www.sohu.com:8080/abc/index.htm

    . 要求得到的協(xié)議是什么? http

    域名是什么? ww.sohu.com

    端口是什么? 8080

    文件名是什么?index.htm

    public class RegExpDemo1 {
        public static void main(String[] args) {
           String url = "https://www.sohu.com:8080/abc/index.htm";
           //如果有其他情況或者一些特殊字符什么的,可以對正則表達式內容進行適當?shù)恼{整
            String regExp = "^(?<g1>[a-zA-Z]+)://(?<g2>([\\w-]+\\.)+[\\w-]+)(?<g3>:[\\d]{1,5})/[\\w-/?.#%&=]*/(?<g4>[\\w-]+(\\.[\\w]+))?$";
            Pattern pattern = Pattern.compile(regExp);
            Matcher matcher = pattern.matcher(url);
            if (matcher.find()) {
                System.out.println("解析成功,結果如下");
                System.out.println("解析出的協(xié)議為:"+matcher.group("g1"));
                System.out.println("解析出的域名為:"+matcher.group("g2"));
                System.out.println("解析出的端口為:"+matcher.group("g3"));
                System.out.println("解析出的文件名為:"+matcher.group("g4"));
            } else {
                System.out.println("解析失敗");
            }
        }
    }
    

    運行結果截圖:

總結 

到此這篇關于JavaSE正則表達式用法總結大全的文章就介紹到這了,更多相關JavaSE正則表達式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring存儲與讀取Bean對象方法

    Spring存儲與讀取Bean對象方法

    在Spring中,要想更簡單的存儲和讀取對象的核心是使用注解,這篇文章主要給大家介紹了關于Spring如何通過注解存儲和讀取對象的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-01-01
  • 解決springcloud-eureka注冊時的ip問題

    解決springcloud-eureka注冊時的ip問題

    這篇文章主要介紹了解決springcloud-eureka注冊時的ip問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java之minio文件服務器的日常操作

    java之minio文件服務器的日常操作

    本文介紹如何在Java項目中配置Minio服務,通過創(chuàng)建minioConfig和minioDto來管理連接信息,并通過minioUtils工具類實現(xiàn)文件的上傳、下載和刪除功能,詳細說明了如何從application.yml文件中讀取配置,并強調了避免static情況下minioDto為null的問題,另外,提到刪除操作是延遲的
    2024-10-10
  • Java重點梳理類與對象核心原理

    Java重點梳理類與對象核心原理

    類(class)和對象(object)是兩種以計算機為載體的計算機語言的合稱。對象是對客觀事物的抽象,類是對對象的抽象。類是一種抽象的數(shù)據(jù)類型
    2022-07-07
  • java new一個對象的過程實例解析

    java new一個對象的過程實例解析

    這篇文章主要介紹了java new一個對象的過程實例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 在Spring Boot中實現(xiàn)多環(huán)境配置的方法

    在Spring Boot中實現(xiàn)多環(huán)境配置的方法

    在SpringBoot中,實現(xiàn)多環(huán)境配置是一項重要且常用的功能,它允許開發(fā)者為不同的運行環(huán)境,這種方式簡化了環(huán)境切換的復雜度,提高了項目的可維護性和靈活性,本文給大家介紹在Spring Boot中實現(xiàn)多環(huán)境配置的方法,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Java實現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼

    Java實現(xiàn)經(jīng)典角色扮演偵探游戲游戲的示例代碼

    這篇文章主要介紹了如何利用Java語言自制一個偵探文字游戲—《角色扮演偵探》,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編學習一下
    2022-02-02
  • java ArrayList和Vector的區(qū)別詳解

    java ArrayList和Vector的區(qū)別詳解

    這篇文章主要介紹了java ArrayList和Vector的區(qū)別詳解的相關資料,并附簡單實例代碼,需要的朋友可以參考下
    2016-11-11
  • springboot集成WebSockets廣播消息(推薦)

    springboot集成WebSockets廣播消息(推薦)

    這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • java-servlet-轉發(fā)AND路徑(詳解)

    java-servlet-轉發(fā)AND路徑(詳解)

    下面小編就為大家?guī)硪黄猨ava-servlet-轉發(fā)AND路徑(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10

最新評論

兴和县| 嘉义县| 高青县| 大安市| 南阳市| 阿克陶县| 宁南县| 固始县| 宜州市| 栾川县| 依兰县| 武陟县| 兴海县| 鄂尔多斯市| 浮山县| 黎川县| 余江县| 宁明县| 华容县| 嘉黎县| 乌拉特中旗| 麻栗坡县| 静海县| 浦县| 晴隆县| 湘阴县| 四平市| 岚皋县| 缙云县| 襄汾县| 西充县| 巩义市| 绍兴市| 惠州市| 景德镇市| 绍兴市| 北碚区| 行唐县| 郎溪县| 甘孜县| 民丰县|