国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 正則表達(dá)式【非貪婪匹配、格式驗證、反向引用、API】

這篇具有很好參考價值的文章主要介紹了Java 正則表達(dá)式【非貪婪匹配、格式驗證、反向引用、API】。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

非貪婪匹配

非貪婪匹配的元字符是問號 ??

當(dāng)此字符跟在任何其他限定符(*、+、?、{n}、{m}、{n,m})之后,匹配模式是 "非貪心的"。非貪心的意思就是每次匹配搜索到的盡可能短的字符串,可以是0個。

案例

對比貪婪匹配和非貪婪匹配

貪婪匹配

public static void main(String[] args) {
        String content  = "hello1010";

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }
    }

輸出結(jié)果:

1010

非貪婪匹配

public static void main(String[] args) {
        String content  = "hello1010";

        Pattern pattern = Pattern.compile("\\d+?");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            System.out.println(matcher.group(0));
        }
    }

輸出結(jié)果:

1
0
1
0

正則表達(dá)式應(yīng)用實例

對字符串進(jìn)行如下格式驗證:

注意:格式驗證不同于普通的匹配,格式匹配通常使用字符匹配符、定位符和限定符三種來進(jìn)行匹配,尤其是限定符(定位符?^ 、$),比如我們要判斷 "123456"是不是三位數(shù),如果我們使用如下的正則表達(dá)式:

\\d{3}

運行結(jié)果:

123
456

但其實是不匹配的,所以我們需要加定位符:

^\\d\\d{2}$

意思就是匹配以一位數(shù)字為開頭,兩位數(shù)字為結(jié)尾的字符串。

下面為了避免重復(fù)代碼,我把模板放到這,只需要替換正則表達(dá)式的表達(dá)式即可。

        Pattern pattern = Pattern.compile("");
        Matcher matcher = pattern.matcher(content);
        
        if (matcher.find()){
            System.out.println("滿足格式");
        }

1、漢字

漢字的編碼為? \u0391 到 \uffe5。

^[\u0391-\uffe5]+$

2、郵政編碼

要求:是1~9開頭的一個六位數(shù)

^[1-9]\\d{5}$

3、QQ號碼

要求:是1-9開頭的一個(5-10位數(shù))

^[1-9]\\d{4,9}$

4、手機(jī)號碼

必須 13,14,15,18 開頭的11位數(shù)。

我們可以使用小括號和豎線符號表示邏輯或,也可以使用中括號進(jìn)行范圍表示。

^(13|14|15|18)\\d{9}$
//或者
^(1[3458])\\d{9}$

5、URL

URL 的匹配很重要,尤其是在網(wǎng)絡(luò)爬蟲中會經(jīng)常用到。

https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343

正則表達(dá)式:?

^((http|https)://)?([\w-]+\.)+[\w-]+(\/[\w-?=&/%#.]*)?$

注意:我們這里的正則表達(dá)式中的括號都是捕獲分組,如果希望不捕獲的話,可以在左半括號加一個問號?,這樣就成了非捕獲分組,非捕獲分組的內(nèi)容不會保存到Matcher類中的groups數(shù)組中去,而捕獲分組的內(nèi)容會保存到內(nèi)存中,可以通過Matcher.group(int group)的方式從groups數(shù)組提取出來或者顯示命名的分組可以通過自定義的組名提取出來(詳細(xì)可以看我第二篇博客關(guān)于捕獲分組的部分)。?

System.out.println(matcher.group(0));    //https://blog.csdn.net/m0_64261982?spm=1000.2115.3001.5343
System.out.println(matcher.group(1));    //https://
System.out.println(matcher.group(2));    //https
System.out.println(matcher.group(3));    //csdn.
System.out.println(matcher.group(4));    ///m0_64261982?spm=1000.2115.3001.5343

其中:

^((https)://)?
https:// 這里用了非貪婪匹配,網(wǎng)址可以省去協(xié)議
([\\w-]+\\.)+[\\w-]+
blog.csdn.net
把帶 '.' 的用([\\w-]+\\.)+ 來匹配,后綴 .com或者 .net 這些用 [\\w-]+ 來匹配
(\\/[\\w-?=&/%#.]*)?$
m0_64261982?spm=1000.2115.3001.5343
后面主要處理的就是一些特殊符號,看情況增加

注意: [?.*] 中括號里的點和問號只代表本身 沒有特殊含義。

Pattern 類

之前我要做一些格式驗證的話需要寫很多代碼,其實我們可以直接使用Pattern類中的一個matches方法,它可以對傳入的正則表達(dá)式和字符串參數(shù)直接做一個整體匹配。

比如,驗證QQ號:

        System.out.println(Pattern.matches("^[1-9]\\d{4,9}$","3493247023"));

這樣就可以極大地簡潔代碼,而不用去調(diào)用 Matcher 去一個個匹配??傊琍attern.matches()適合做整體匹配,但不能做字符串中滿足某一正則表達(dá)式的所有子串的匹配,所以看情況使用。

Matcher 類

?這里介紹一些Matcher對象的其他方法。

我們以如下字符串為例:

小美喜歡小明,小明也喜歡小美。

start 和 end 方法

start 和 end 會輸出匹配到的字符串的下標(biāo)

String content  = "小美喜歡小明,小明也喜歡小美。";

        Pattern pattern = Pattern.compile("喜歡");
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()){
            System.out.println("=================");
            System.out.println(matcher.group(0));
            System.out.println(matcher.start());
            System.out.println(matcher.end());
        }

輸出:

=================
喜歡
2
4
=================
喜歡
10
12

replaceAll 方法

把滿足正則表達(dá)式的子串內(nèi)容替換為參數(shù)的內(nèi)容。

    String content  = "清華大學(xué)是中國著名的大學(xué)";

        Pattern pattern = Pattern.compile("清華");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()){
            String res = matcher.replaceAll("山西農(nóng)業(yè)");
            System.out.println(res);
        }

輸出:

山西農(nóng)業(yè)大學(xué)是中國著名的大學(xué)

反向引用

反向引用和分組、捕獲是有關(guān)系的,下面是反向引用的概念:

圓括號的內(nèi)容被捕獲后,可以在這個括號后使用,從而寫出一個比較實用的匹配模式,這個我們稱之為反向引用,這種引用既可以是在正則表達(dá)式內(nèi)部,用 \\分組號;也可以是在正則表達(dá)式外部,用 $分組號

案例1-AA

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

(\\d)\\1

案例2-AAAAA

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

(\\d)\\1{4}

案例3-ABBA

找出字符串中所有滿足 ABBA 型的子串。

?(\\d)(\\d)\\2\\1
String content = "12212121212222";
        String regex = "(\\d)(\\d)\\2\\1";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()){
            System.out.println(matcher.group());
        }

?文章來源地址http://www.zghlxwxcb.cn/news/detail-647861.html

輸出:

1221
2222

案例4

檢索商品編號:形式如:12321-333999111 這樣的號碼,前面是一個五位數(shù),然后是一個-,最后是一個AAABBBCCC型的9位數(shù)。

\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}

案例5-結(jié)巴去重

?核心語句:(.)\\1+ 代表至少有兩個重復(fù)字符的子串。

public static void main(String[] args) {
        String content = "我...我要...學(xué)學(xué)學(xué)學(xué)...Java!";

        // 1. 去掉所有的.
        Pattern pattern = Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(content);

        content = matcher.replaceAll("");

        // 2. 去掉重復(fù)的字
        pattern = Pattern.compile("(.)\\1+");
        matcher = pattern.matcher(content); //matcher 對象需要重新賦值

        content = matcher.replaceAll("$1");
        System.out.println(content);
}

簡潔寫法:

content = Pattern.compile("(.)\\1+").matcher(content).replaceAll("$1");

輸出:

我要學(xué)Java!

String 類中的正則表達(dá)式

1、String.replaceAll(String regex,String replacement)

將content中滿足正則表達(dá)式regex的子串替換為 replacement。

2、public boolean matches(String regex)

判斷字符串是否滿足正則表達(dá)式regex,相當(dāng)于Pattern.matches(String regex,String content)。

3、public String[] split(String regex)

按照正則表達(dá)式regex分割字符串

?

?

?

?

到了這里,關(guān)于Java 正則表達(dá)式【非貪婪匹配、格式驗證、反向引用、API】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Java 基礎(chǔ)進(jìn)階篇(十八):正則表達(dá)式匹配規(guī)則和應(yīng)用

    Java 基礎(chǔ)進(jìn)階篇(十八):正則表達(dá)式匹配規(guī)則和應(yīng)用

    ??正則表達(dá)式是對字符串(包括普通字符(例如:a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。正

    2024年02月13日
    瀏覽(36)
  • java正則表達(dá)式匹配替換大括號變量${}和替換${}變量的值

    java正則表達(dá)式替換“$ {}”特殊字符并還原,以及java正則表達(dá)式替換${}變量為變量的值這兩種操作的代碼示例。 正則表達(dá)式還是非常有用的, 可以耐心看下定義,多嘗試下。 正則表達(dá)式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將

    2024年02月02日
    瀏覽(26)
  • 【正則表達(dá)式】正則表達(dá)式常見匹配模式

    模式 描述 w 匹配字母數(shù)字及下劃線 W 匹配非字母數(shù)字下劃線 s 匹配任意空白字符,等價于 [tnrf]. S 匹配任意非空字符 d 匹配任意數(shù)字,等價于 [0-9] D 匹配任意非數(shù)字 A 匹配字符串開始 Z 匹配字符串結(jié)束,如果是存在換行,只匹配到換行前的結(jié)束字符串 z 匹配字符串結(jié)

    2024年02月09日
    瀏覽(40)
  • 【Java】正則表達(dá)式,校驗數(shù)據(jù)格式的合法性。

    【Java】正則表達(dá)式,校驗數(shù)據(jù)格式的合法性。

    個人簡介:Java領(lǐng)域新星創(chuàng)作者;阿里云技術(shù)博主、星級博主、專家博主;正在Java學(xué)習(xí)的路上摸爬滾打,記錄學(xué)習(xí)的過程~ 個人主頁:.29.的博客 學(xué)習(xí)社區(qū):進(jìn)去逛一逛~ 正則表達(dá)式 : ①可以校驗字符串是否滿足一定的規(guī)則,并用來校驗數(shù)據(jù)格式的合法性。 案例: 對象名.ma

    2024年02月08日
    瀏覽(24)
  • 正則表達(dá)式 (用于靈活匹配文本的表達(dá)式)

    目錄 . * 用于匹配任意單個字符,除了換行符。 例如使用正則表達(dá)式 a.b, 它可以匹配aab、acb、a#b 用于匹配前一個字符零次或多次。 例如,使用正則表達(dá)式 ab*c ,它可以匹配 \\\"ac\\\"、\\\"abc\\\"、\\\"abbc\\\",因為 b* 表示匹配零個或多個字符 \\\"b\\\"。所以,這個表達(dá)式可以匹配 \\\"ac\\\"(零個 \\\"b\\\"),

    2024年01月16日
    瀏覽(33)
  • java中通過split方法使用分號分割,使用正則表達(dá)式匹配不識別單引號中的分號

    在Java中,使用split()方法可以通過指定正則表達(dá)式作為分隔符來拆分字符串。如果你想忽略單引號內(nèi)的分號,可以使用以下代碼: 在這個正則表達(dá)式中,它使用反向零寬斷言 (?!...) 和順序零寬斷言 (?=...) 來限制分隔符的匹配位置,以確保只有在非單引號內(nèi)部的位置才會進(jìn)行分

    2024年02月08日
    瀏覽(26)
  • 正則表達(dá)式的神奇世界:表達(dá)、匹配和提取

    正則表達(dá)式,這個看起來像密林中的迷宮的工具,既神秘又令人著迷。它是編程世界中的一門魔法,有著神奇的能力。你是否曾經(jīng)在尋找或解析文本時感到束手無策?或許你想要從海量數(shù)據(jù)中提取特定信息?這正是正則表達(dá)式可以派上用場的時候。本文將帶你探索這個神奇的

    2024年02月07日
    瀏覽(35)
  • VSCode 正則表達(dá)式 匹配多行

    VSCode 正則表達(dá)式 匹配多行

    VS Code 正則表達(dá)式匹配多行 (.|n)*? 案例1: str(.|n)*?, 案例2: const(.|n)*?}$ 案例3: fn(.|n)*?},

    2024年02月02日
    瀏覽(21)
  • 【動態(tài)規(guī)劃】通配符匹配與正則表達(dá)式匹配

    【動態(tài)規(guī)劃】通配符匹配與正則表達(dá)式匹配

    題目描述: 給你一個輸入字符串 (s) 和一個字符模式 § ,請你實現(xiàn)一個支持 ‘?’ 和 ‘*’ 匹配規(guī)則的通配符匹配: ‘?’ 可以匹配任何單個字符。 ‘*’ 可以匹配任意字符序列(包括空字符序列)。 判定匹配成功的充要條件是:字符模式必須能夠 完全匹配 輸入字符串(而

    2024年02月07日
    瀏覽(36)
  • 正則表達(dá)式的匹配(py編程)

    1. 匹配單個字符 在上一小節(jié)中,了解到通過re模塊能夠完成使用正則表達(dá)式來匹配字符串 本小節(jié),將要講解正則表達(dá)式的單字符匹配 代碼 功能 . 匹配任意1個字符(除了n) [ ] 匹配[ ]中列舉的字符 d 匹配數(shù)字,即0-9 D 匹配非數(shù)字,即不是數(shù)字 s 匹配空白,即 空格,tab鍵

    2024年02月02日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包