Java正則表達(dá)式

定義:正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串。正則表達(dá)式使用單個(gè)字符串來(lái)描述、匹配一系列匹配某個(gè)句法規(guī)則的字符串。

Example : 匹配 github.com 的url

public String githubUrl = "https://github.com/BJChaney/BJChaney.github.io?1=1&2=2";

public String githubRegex = "(https?://)?github.com(/[\\w._]+)*\\??([\\w_]+=[\\w._]+&?)*";

基本概念

1. 字符表示
字符 含義
. 任意字符
[abc] a,b,c中其中一個(gè)
[^abc] 非a,b,c的字符
[a-z] 從a到z的任意字符
[a-z&&[a-c]] a到c的任意字符(兩集合交集)
\s 空白字符(空格,回車(\r),換行(\n),tab(\t),換頁(yè)(/f))
\S 非空白字符
\d 數(shù)字[0-9]
\D 非數(shù)字
\w 詞字符[a-zA-Z0-9]
\W 非詞字符
2. 頻率表示符
字符 含義
* 0次或多次
? 1次或0次
+ 1次或多次
X{n} 剛好n次
X{n,} 最少n次
X{n,m} 大于n次,小于m次
3. 邏輯操作
邏輯操作符 含義 例子
XY Y在X后面 abc 邏輯順序abc,匹配一個(gè)為abc的字符串
X丨Y X或Y abc丨def 匹配一個(gè)abc或者一個(gè)def字符串
(X) (abc) 可以匹配abc組,如(abc)+可以匹配abc,abcabc,abcabcabc...

例子解析

首先分析例子,因?yàn)槭瞧ヅ?a target="_blank" rel="nofollow">github.com,所以github.com是必須存在的,http:// 請(qǐng)求頭可能存在,也可能不存在,后面的路徑和請(qǐng)求參數(shù)都是可能不存在的

  1. 請(qǐng)求頭表示演變

    源:https://

    -> https?:// 可能不是https請(qǐng)求頭

    -> (https?://)? 可能整組 https:// 都不存在,存在只存在一次

  2. 路徑演變

    源:/BJChaney/BJChaney.github.io

    -> /[\w._]+ 都是/XXX的結(jié)構(gòu) 并且/之后至少有1個(gè)字符,路徑中還可能包含 . _等符號(hào)

    -> (/[\w._]+)* 路徑整體是可以不存在或者存在多次的

  3. 參數(shù)列表演變

    源:?1=1&2=2

    -> \?? 參數(shù)列表如果存在,前邊必須有一個(gè)?,因?yàn)椋渴翘厥夥?hào),所以要轉(zhuǎn)義一下寫(xiě)成\?

    -> [\w_]+=[\w._]+&? 參數(shù)格式為xxx=xxx,等號(hào)兩邊必須有一個(gè)字符,多個(gè)參數(shù)間可能存在&符號(hào)

    -> ([\w_]+=[\w._]+&?)* 可能存在許多參數(shù)

    ->組合 \??([\w_]+=[\w._]+&?)*

  4. 最終組合成完整正則:(https?://)?github.com(/[\w.]+)*\??([\w]+=[\w._]+&?)*

取值

正則取值,主要是通過(guò)組()來(lái)取

組:使用括號(hào)劃分的正則表達(dá)式,默認(rèn)根據(jù)組的編號(hào)來(lái)引用組,組0表示整個(gè)表達(dá)式,組1表示第一個(gè)被括號(hào)括起的組,依此類推

Example : A(B(C))D
其中,組0為ABCD,組1為BC,組2為C

組默認(rèn)是自增方式來(lái)編號(hào)的,可以利用自定義組名去取其中某段內(nèi)容,格式:(?<組名>)

Demo:取出并打印url的參數(shù)列表

正則中添加 (?<params>)

/**
 *
 * @author BJChaney
 */
public class RegExpTest {

public static void main(String[] args) {

    String githubUrl = "https://github.com/BJChaney/BJChaney.github.io?1=1&2=2";

    String githubRegex = "(https?://)?github.com(/[\\w._]+)*\\??(?<params>([\\w_]+=[\\w._]+&?)*)";

    System.out.println("match ? " + githubUrl.matches(githubRegex));
    Pattern pattern = Pattern.compile(githubRegex);
    Matcher matcher = pattern.matcher(githubUrl);
    if (matcher.find()) {
        String paramStr = matcher.group("params");
        System.out.println("params : " + paramStr);
        System.out.println("paramsCount : " + matcher.groupCount());
        for(int i = 0 ; i <= matcher.groupCount() ; i ++){
            System.out.println("group : " + i +"  content : " + matcher.group(i) );
        }
        pattern = Pattern.compile("&");
        String[] params = pattern.split(paramStr);
        for (String param : params) {
            String key = param.split("=")[0];
            String value = param.split("=")[1];
            System.out.println("key = " + key + " value = " + value);
        }
    }
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java的正則表達(dá)式講解:(為了能看清,本文正則表達(dá)式用中文的句號(hào)代替英文句點(diǎn)) 英文句點(diǎn)符號(hào):匹配單個(gè)任意字符。...
    紅姑娘閱讀 4,534評(píng)論 0 2
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 1匹配驗(yàn)證-驗(yàn)證Email是否正確 2在字符串中查詢字符或者字符串 3常用正則表達(dá)式 規(guī)則 正則表達(dá)式語(yǔ)法一個(gè)或...
    大赟哥閱讀 515評(píng)論 0 0
  • 每個(gè)人都應(yīng)該成就更好的自己。今天看電視的時(shí)候有注意到這麼一段話,感觸很深。是啊!人一生的樂(lè)趣是什麼?生活,怎...
    美梅閱讀 259評(píng)論 0 0
  • 遇到小確幸,心情很好;回味一下,心情也能變好。 1.一路遇到好幾個(gè)綠燈; 2.一路遇到好幾個(gè)紅燈,但到了單位發(fā)現(xiàn)恰...
    野人獻(xiàn)曝閱讀 394評(píng)論 0 0

友情鏈接更多精彩內(nèi)容