java正則表達式使用

簡介

對于一些文本操作,正則表達式提供了強有力的輔助,它允許我們通過帶有描述性性質(zhì)的描述語言,得到我們需要的文本數(shù)據(jù)。

java正則表達式功能類簡介

對于java而言,其在java.util.regex包中給我們提供了正則表達式功能,該包結(jié)構(gòu)如下圖所示:

java.util.regex

可以看到,regex包下包含一個接口MatchResult,兩個類Pattern,Matcher,以及一個異常類PatternSyntaxException。
其中:
MatchResult:代表匹配操作的結(jié)果,該接口提供了查詢方法用來檢測匹配器匹配正則表達式的結(jié)果。通過MatchResult,可以查看匹配邊界,匹配組合以及組邊界,但是不能進行修改。

Pattern:正則表達式的編譯表現(xiàn)形式。指定為正則表達式的字符串必須首先被編譯成此類的實例,然后,可將得到的模式用于創(chuàng)建Matcher對象,依照正則表達式,該對象可與任意字符序列匹配。執(zhí)行匹配所涉及的所有狀態(tài)都駐留在匹配器中,所以多個匹配器可以共享同一模式。

Matcher:執(zhí)行由Pattern解釋的字符串序列操作引擎。Matcher實現(xiàn)了MatchResult

PatternSyntaxException:當正則表達式解析出錯時拋出該異常。

通配符簡介

java正則表達式的全部通配符介紹可以在官網(wǎng)API中查看,下面主要介紹其中一些比較常用的:

字符類
[abc] 匹配a或者b或者c
[^abc] 除了a,b,c以外的字符都匹配
[a-zA-Z] a-z,A-Z任意一個字符都匹配
[a-d[m-p]] a-d或者m-p中任意一個字符都匹配
[a-z&&[def]] 同時滿足a-z和d,e,f中的一個則匹配(并集)
[a-z&&[^bc]] a-z任意一個字符都匹配,除了b和c
ab|cd 或匹配器,匹配 ab 或 cd
預(yù)定義字符類
. 任意字符 (與<u>行結(jié)束符</u>可能匹配,也可能不匹配)
\d 數(shù)字 [0-9]
\D 非數(shù)字 [^0-9]
\s 空白字符 [ \t\n\x0B\f\r]
\S 非空白字符 [^\s]
\w 字符類型 [a-zA-Z_0-9]
\W 非字符類型 [^\w]
邊界匹配器
^ 行開頭
$ 行結(jié)尾
\b 單詞邊界
\B 非單詞邊界
Greedy 數(shù)量詞
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n次
X{n,} X,至少n次
X{n,m} X,至少n次,但不超過m次

例子

正則表達式對文本的操作總結(jié)起來為:匹配,切割,替換,獲取。

  • 匹配
    判斷給定字符串是否符合QQ號碼格式。
    (QQ號碼格式規(guī)范:
    1.全部為數(shù)字
    2.起碼6位數(shù)字以上,不超過15位數(shù);
    3.第一個數(shù)字不能為0;)
    String str = "23453463456";
    Pattern pattern = Pattern.compile("[1-9]\\d{5,15}");
    Matcher matcher = pattern.matcher(str);
    boolean bMatch = matcher.matches();
    System.out.println("match="+bMatch);
  • 切割
    對給定字符串,按空格進行切割。
    String str="first   second   third  ";
    Pattern pattern = Pattern.compile("\\s+");//或者“ ”+
    String[] splits = pattern.split(str);
    for(int i = 0 ; i < splits.length ; ++i){
        System.out.println("splits["+i+"]="+splits[i]);
    }
  • 替換
    對給定字符串,按疊詞進行替換,將疊詞數(shù)量保留一位。
    String str="abb3dadadfa333aaaaaaaa";
    Pattern pattern = Pattern.compile("(.)\\1+");
    Matcher matcher = pattern.matcher(str);
    String replaceStr = matcher.replaceAll("$1");
    System.out.println("replaceStr="+replaceStr);

注: 此處使用了組概念,用符號()表示一個組,正則表達式"(.)\1+"表達的意思是:任意字符,\1表示引用第一組的結(jié)果,也就是(.)的字符,所以這句話的意思就是第一個字符是任意字符,后面一個字符跟前一個一致,有一個或一個以上。
“$1"表示引用第一個組的內(nèi)容。

  • 獲取
    對給定字符串,取出大括號{}內(nèi)的字符串。
    String str = "users/{user}/repos/{page}/";
    Pattern pattern = Pattern.compile("\\{([a-zA-Z][a-zA-Z0-9_-]*)\\}");
    Matcher matcher = pattern.matcher(str);
    while(matcher.find()){
        String findstr = matcher.group();
        System.out.println("findstr="+findstr);
    }

最后,網(wǎng)上有很多可以直接對正則進行驗證的在線工具,大家可以去找找看。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 初衷:看了很多視頻、文章,最后卻通通忘記了,別人的知識依舊是別人的,自己卻什么都沒獲得。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,243評論 0 20
  • 前言 對于正則,著稱火星文字,見名知意主要它晦澀難懂,一直以來,看到它總是怕怕的,在平時,也只是簡單的用用,其主要...
    itclanCoder閱讀 904評論 0 2
  • 沒想到前幾日的文章還會有評論,真是讓我受寵若驚。但是原諒我不再一一回復了。 今天和大長腿小姐講到張愛玲,我?guī)缀跻呀?jīng)...
    獨木Atree閱讀 589評論 0 5
  • 有大半年沒上過菜市場,新近搬了家,頭等大事當然是尋訪附近的菜市場。從一個隱蔽的入口進去,沒來得及贊嘆社區(qū)規(guī)劃的高明...
    微冷微冷閱讀 13,163評論 5 11
  • 進了小公司的應(yīng)屆程序員如何翻身進入大公司——知乎上的一個問題,有近 4700 人關(guān)注,130 多萬次瀏覽,我的回...
    安曉輝0閱讀 3,617評論 10 60

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