正則表達式
正則表達式(Regular Expression) 是一種特殊的字符串模式(pattern), 用於匹配一組字符串,就好比用模具做產品,而正則就是這個模具,定義一種規則去匹配符合規則的字符。本篇主要基於Java語言來說,以應用爲主。
在線測試工具: https://tool.oschina.net/regex/
快速入門:https://www.runoob.com/regexp
通過使用正則表達式,可以:
- 測試字符串內的模式。
- 替換文本。
- 基於模式匹配從字符串中提取子字符串。
特殊字符
許多元字符要求在試圖匹配它們時特別對待。若要匹配這些特殊字符,必須首先使字符"轉義",即,將反斜槓字符\
放在它們前面。下表列出了正則表達式中的特殊字符:
字符 | 描述 | 舉例 |
---|---|---|
^ | 1. 匹配輸入字符串的開始位置 2. 如果設置了 RegExp 對象的 Multiline 屬性,^ 還會與"\n"或"\r"之後的位置匹配 3. 在方括號中,表示 ‘非’ 操作 |
|
$ | 1. 匹配輸入字符串的結尾位置 2. 如果設置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"之前的位置匹配 |
|
. | 匹配除換行符\n之外的任意單字符 | |
* | 匹配前面的子表達式零次或多次,同 {0,} | |
+ | 匹配前面的子表達式一次或多次,同 {1,} | |
? | 1. 匹配前面的子表達式零次或一次,同 {0, 1} 2. 指明一個非貪婪限定符 |
|
( ) | 圓括號是表示組,主要應用在限制多選結構範圍/分組/捕獲文本/環視/特殊模式處理 見圓括號詳解 |
|
[] | 定義匹配的字符範圍,包含字符集/排除字符集/命名字符集,匹配集合中的單個字符 | [0-3] 表示匹配0到3四個數字中的任意一個字符,與(0|1|2|3) 相同,但後者可以匹配多個連續字符[0123] 和 [0-3] 功能相同[^0-3] 表示匹配0到3四個數字以外的任意一個字符(命名字符集,沒有使用過) |
{} | 標記限定符表達式, 用來限定匹配長度 | \s{3} 表示匹配三個空白字符 \s{1,3}表示匹配1到3個空白字符 |
| | 指明兩項之間的選擇 | f(oo|ee)t 表示匹配‘foot’或‘feet’ |
\ | 將下一個字符標記爲一個特殊字符 (原義字符、向後引用、八進制轉義符) |
限定符
限定符用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表達式零次或多次 |
+ | 匹配前面的子表達式一次或多次 |
? | 匹配前面的子表達式零次或一次 |
{n} | n是一個非負整數,匹配確定的n次 |
{n,} | n是一個非負整數,至少匹配n次 |
{n,m} | m和n均非負整數,其中n<=m。最少匹配n次且最多匹配m次。 |
*
和 +
限定符都是貪婪的
,因爲它們會盡可能多的匹配文字, 只有它們的後面加上一個 ?
就可以實現非貪婪或最小匹配。(在?
後再加一個?
,也是非貪婪匹配, 不知實際場景中會不會用到 )
貪婪匹配
與非貪婪匹配
文本內容:
<h1> 正則表達式應用</h1>
貪婪匹配: (<.*>),匹配結果:
<h1> 正則表達式應用</h1>
非貪婪匹配: (<.*?>), 匹配結果:
<h1>
圓括號詳解
圓括號是表示組,主要應用在限制多選結構範圍/分組/捕獲文本/環視/特殊模式處理。當與或字符|
同時使用時,進行分組匹配
測試文本
Java6 Java7 Java8 Java9
字符 | 描述 | 舉例 |
---|---|---|
(pattern) | 匹配pattern並獲取這一匹配。 | Java(6|7|8) 匹配到 Java6 Java7 Java8 , 並獲取匹配到對應的版本號 |
(?:pattern) | 匹配pattern,但不獲取匹配到文本。 | Java(?:7|8) 匹配Java7 Java8 , 但不捕獲版本號 |
(?=pattern) | 正向肯定預查 | Java(?=6|7) 匹配到的結果Java Java , 對應的項’Java6‘ 和’Java7‘ |
(?!pattern) | 正向否定預查 | Java(?!6|7|8) 匹配到的結果Java , 對應的項’Java9‘ |
(?<=pattern) | 反向肯定預查 | (?<=J)a[v|\d] 匹配到的結果 av av av av , [v|\d] 爲了看出是哪個’a‘ |
(?<!pattern) | 反向否定預查 | (?<!J)a[v|\d] 匹配到的結果a6 a7 a8 a9 |
注: 四種預查情況均是非捕獲匹配,不進行存儲供以後使用
其它字符
字符 | 描述 | 舉例 |
---|---|---|
\b | 匹配單詞邊界,即單詞與空格的位置 | |
\B | 匹配非單詞邊界 | |
\cx | 匹配由x指明的控制字符,x的取值必須爲A-Z或a-z之一 (沒有應用過) | |
\d | 匹配一個數字字符,同[0-9] |
|
\D | 匹配一個非數字字符,同[^0-9] |
|
\f | 匹配一個換頁符,同 \x0c 和\cL |
|
\n | 匹配一個換行符,同\x0a 和\cJ |
|
\r | 匹配一個回車符,同\x0d 和\cM |
|
\s | 匹配任意空白字符,包括空格、製表符、換頁符等,同[\f\n\r\t\v] |
|
\S | 匹配任意非空白字符,同[^\f\n\r\t\v] |
|
\t | 匹配一個製表符,同\x09 和\cl |
|
\v | 匹配一個垂直製表符,同\x0b 和\cK |
|
\w | 匹配字母、數字、下劃線, 同[A-Za-z0-9_] |
|
\W | 匹配非字母、數字、下劃線, 同[^A-Za-z0-9_] |
|
\xn | 匹配n,其中n爲十六進制的轉義值,十六進制轉義值必須爲確定的兩個數字長 | |
\num | 匹配num,其中num是一個正整數,對所獲取的匹配的引用。(未理解) | |
\n | 標識一個八進制轉義值或一個向後引用(未想到應用場景) | |
\nm | 標識一個八進制轉義值或一個向後引用(未想到應用場景) | |
\nml | 八進制相關,(未理解) | |
\un | 匹配n, 其中n是一個用四位十六進制數字表示的Unicode字符 | \u6b63\u5219 匹配中文 ’正則‘ |
運算優先級
正則表達式從左到右進行計算,並遵循優先級順序。相同優先級從左到右進行運算,不同優先級先高後低。運算符的優先級順序:
\
-->()、(?:)、(?=)、[]
-->*、 +、 ?、 {n}、 {n,}、 {n,m}
-->
^、 $、\任意元字符、任意字符
-->|