正規表示式入門級看懂語法

2021-07-23 01:36:10 字數 4561 閱讀 6184

pattern pattern = pattern.compile("a*b");

matcher matcher = pattern.matcher("aaaabbb");

boolean ismathersucess = matcher.matches();//返回是否匹配成功

不得不說,使用起來還是很簡單的,比較難搞懂的是正規表示式的語法。

1. 元字元

作用:具有特殊的含義的字元,一般用於指定匹配規則。

比如:

元字元\b,代表著單詞的開頭或結尾,也就是單詞的分界處.

\bhi\b,意思就是匹配單詞開頭或結尾是hi的單詞。

表1.常用的元字元 ** 說明 

. 匹配除換行符以外的任意字元

\w 匹配字母或數字或下劃線或漢字

\s 匹配任意的空白符

\d 匹配數字

\b 匹配單詞的開始或結束

^ 匹配字串的開始

$ 匹配字串的結束

2. 字元轉義

如果你想查詢元字元本身的話,比如你查詢.,或者*,就出現了問題:你沒法指定它們,因為它們會被解釋成其它的意思。這時你就必須使用\來取消這些字元的特殊意義。因此,你應該使用.和*。當然,要查詢\本身,你也得用\.

重複:

用於重複匹配的字元。

比如:

windows\d+匹配windows後面跟1個或更多數字

13\d

匹配以13後面跟9個數字(中國的手機號)

^\w+匹配一行的第乙個單詞(或整個字串的第乙個單詞,具體匹配哪個意思得看選項設定)

表2.常用的限定符 **/語法 說明 

* 重複零次或更多次

+ 重複一次或更多次

? 重複零次或一次

重複n次

重複n次或更多次

重複n到m次

4. 字元類

要想查詢數字,字母或數字,空白是很簡單的,因為已經有了對應這些字符集的元字元,但是如果你想匹配沒有預定義元字元的字符集比如母音字母(a,e,i,o,u),怎麼辦?

很簡單,你只需要在中括號裡列出它們就行了,像[aeiou]就匹配任何乙個母音字母,[.?!]匹配標點符號(.或?或!)(英文語句通常只以這三個標點結束)。注意,我們不需要寫成[.\?!]。

我們也可以輕鬆地指定乙個字元範圍,像[0-9]代表的含意與\d就是完全一致的:一位數字,同理[a-z0-9a-z_]也完全等同於\w(如果只考慮英文的話)。如果是匹配所有中文的話,就應該是中文的所有unicode編碼集了[\u4e00-\u9fa5]

5. 反義

有時需要查詢不屬於某個能簡單定義的字元類的字元。比如想查詢除了數字以外,其它任意字元都行的情況,這時需要用到反義:

表3.常用的反義** **/語法 說明 

\w 匹配任意不是字母,數字,下劃線,漢字的字元

\s 匹配任意不是空白符的字元

\d 匹配任意非數字的字元

\b 匹配不是單詞開頭或結束的位置

[^x] 匹配除了x以外的任意字元

[^aeiou] 匹配除了aeiou這幾個字母以外的任意字元

6. 替換

正規表示式裡的替換指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。

比如:

0\d-\d|0\d-\d這個表示式能匹配兩種以連字型大小分隔的**號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。

(0\d)[- ]?\d|0\d[- ]?\d這個表示式匹配3位區號的**號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字型大小或空格間隔,也可以沒有間隔。你可以試試用替換|把這個表示式擴充套件成也支援4位區號的。

7. 分組

重複單個字元(直接在字元後面加上限定符就行了);但如果想要重複乙個字串又該怎麼辦?你可以用小括號來指定子表示式(也叫做分組),然後你就可以指定這個子表示式的重複次數了

(\d.)\d是乙個簡單的ip位址匹配表示式。

要理解這個表示式,請按下列順序分析它:

\d匹配1到3位的數字,

(\d.}匹配三位數字加上乙個英文句號(這個整體也就是這個分組)

重複3次,最後再加上乙個一到三位的數字(\d)。

8. 後向引用

使用小括號指定乙個子表示式後,匹配這個子表示式的文字可以在表示式或其它程式中作進一步的處理。預設情況下,每個分組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。

後向引用用於重複搜尋前面某個分組匹配的文字。例如,\1代表分組1匹配的文字。

\b(\w+)\b\s+\1\b可以用來匹配重複的單詞,像go go, kitty kitty。首先是乙個單詞,也就是單詞開始處和結束處之間的多於乙個的字母或數字(\b(\w+)\b),然後是1個或幾個空白符(\s+,最後是前面匹配的那個單詞(\1)。

你也可以自己指定子表示式的組號或組名。要指定乙個子表示式的組名,請使用這樣的語法:(?\w+),這樣就把\w+的組名指定為word了。要反向引用這個分組捕獲的內容,你可以使用\k,所以上乙個例子也可以寫成這樣:\b(?\w+)\b\s*\k\b。

表4.分組語法 捕獲 

(exp) 匹配exp,並捕獲文字到自動命名的組裡

(?exp) 匹配exp,並捕獲文字到名稱為name的組裡,也可以寫成(?'name'

exp)

(?:exp) 匹配exp,不捕獲匹配的文字

位置指定

(?=exp) 匹配exp前面的位置

(?<=exp) 匹配exp後面的位置

(?!exp) 匹配後面跟的不是exp的位置

(?exp) 匹配前面不是exp的位置

注釋 (?#comment) 這種型別的組不對正規表示式的處理產生任何影響,只是為了提供讓人閱讀注釋

9. 位置指定

用於查詢在某些內容(但並不包括這些內容)之前或之後的東西,也就是說它們用於指定乙個位置,就像\b,^,$那樣,因此它們也被稱為零寬斷言。

(?=exp)也叫零寬先行斷言,它匹配文字中的某些位置,這些位置的後面能匹配給定的字尾exp。比如\b\w+(?=ing\b),匹配以ing結尾的單詞的前面部分(除了ing以外的部分),如果在查詢i』m singing while you』re dancing.時,它會匹配sing和danc。

(?<=exp)也叫零寬後行斷言,它匹配文字中的某些位置,這些位置的前面能給定的字首匹配exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的後半部分(除了re以外的部分),例如在查詢reading a book時,它匹配ading。

假如你想要給乙個很長的數字中每三位間加乙個逗號(當然是從右邊加起了),你可以這樣查詢需要在前面和裡面新增逗號的部分:((?<=\d)\d)*\b。請仔細分析這個表示式,它可能不像你第一眼看出來的那麼簡單。

10. 負向位置指定

如果我們只是想要確保某個字元沒有出現,但並不想去匹配它時怎麼辦?例如,如果我們想查詢這樣的單詞–它裡面出現了字母q,但是q後面跟的不是字母u,我們可以嘗試這樣:

\b\w*q[^u]\w*\b匹配包含後面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發現,如果q出現在單詞的結尾的話,像iraq,benq,這個表示式就會出錯。這是因為[^u]總是匹配乙個字元,所以如果q是單詞的最後乙個字元的話,後面的[^u]將會匹配q後面的單詞分隔符(可能是空格,或者是句號或其它的什麼),後面的\w+\b將會匹配下乙個單詞,於是\b\w*q[^u]\w*\b就能匹配整個iraq fighting。負向位置指定能解決這樣的問題,因為它只匹配乙個位置,並不消費任何字元。現在,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。

零寬負向先行斷言(?!exp),只會匹配字尾exp不存在的位置。\d(?!\d)匹配三位數字,而且這三位數字的後面不能是數字。

11. 貪婪與懶惰

當正規表示式中包含能接受重複的限定符(指定數量的**,例如,等)時,通常的行為是(在使整個表示式能得到匹配的前提下)匹配盡可能多的字元。考慮這個表示式:a.*b,它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配。有時,我們更需要懶惰匹配,也就是匹配盡可能少的字元。前面給出的限定符都可以被轉化為懶惰匹配模式,只要在它後面加上乙個問號?。這樣.?就意味著匹配任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複。現在看看懶惰版的例子吧:

a.*?b匹配最短的,以a開始,以b結束的字串。如果把它應用於aabab的話,它會匹配aab和ab(為什麼第乙個匹配是aab而不是ab?簡單地說,最先開始的區配最有最大的優先權——the match that begins earliest wins)。

正規表示式入門級了解

正規表示式 regular expression 描述了一種字串匹配的模式,可以用來檢查乙個串是否含有某種子串。定義方式 簡單練習 let reg w w com cn org net let str xkkk gz 163.com console.log reg.test str 常用的方法 te...

正規表示式語法入門

正規表示式看不懂?本文介紹簡單的正規表示式語法和幾個簡單的要點,幫助初學者來認識它。首先是特殊字元的說明 看不懂沒關係,下面會有解釋 特別字元描述 匹配輸入字串的結尾位置。如果設定了 regexp 物件的 multiline 屬性,則 也匹配 n 或 r 要匹配 字元本身,請使用 標記乙個子表示式的...

正規表示式入門語法篇

正規表示式 使用單個字串來描述,匹配一系列符合某個語法規則的字串 例項化rexexp語法 1.var reg 此處為正規表示式 eg var reg d 2.var ref new 此處為正規表示式 eg var reg new d 正規表示式語法概念 正規表示式由兩種基本字元型別組成 原義文字字元...