-
- 目的或意義
- 概念
- 應用場景
- 正反向預查
- 非貪婪模式 VS 貪婪模式
- 執行過程
- 遞歸
- 回溯
- 符号的運算優先級
- 正則常用符号及含義
- 普通字元
- 非列印字元
- 特殊字元
- 限定符号
- 字元簇
目的或意義
對字元串進行過濾篩選比對,得到預期的值或效果
概念
對字元串和特殊符号操作的邏輯公式
應用場景
表單校驗,條件搜尋查詢,資料替換等
正反向預查
預查是非捕獲特性,
javascript不支援反向預查
例如:
- ?:
window(?:10|7) 可以比對window10 或 window7
`比對過程是如何的呢?` 字元串從左到右,遊标起始于字元串開始部分的左側,正規表達式的w與字元串w比對,比對成功後,遊标移動到w右側,然後比對i,比對成功後,遊标繼續遊走,以此類推直到遊标停留到字元串末尾
- ?=
遊标由字元串的最左側開始,正規表達式以此比對直到window的右側,此時遊标停留,正則繼續比對,當比對到7的時候,比對成功。由于遊标停留在7的左側(即w的右側),是以得到的比對結果是window而不是window7比對過程又如何呢?
- ?!
此時的比對過程又該如何
跟上面?=類似,不同的是XP與正則中的7不對應時為比對成功
非貪婪模式 VS 貪婪模式
-
貪婪模式
例如:
過程如下:
遊标從a左側開始,正則與字元串比對到ab後,b繼續與b*比對,直到c與b*比對,發現不能比對,于是,選用備選路線,選用用字元串c與正則c比對,比對上遊标前進到c的右側全部比對完成
- 非貪婪模式
例如:
正則中? 是優先考慮的
過程如下:
遊标從字元串”ac”中a的左側開始,正則a與字元a比對上,遊标前進到a的右側,此時模式中的”b*?” 與字元”c”比對不上,于是,選用備用方案,正則會用”c” 與跟 字元串的”c”比對,比對上後,遊标移動到末尾,是以比對的值是ac
執行過程
基于PCRE的正則引擎有一個特點:遞歸和回溯
遞歸
- ^表示起始位置0(即字元串cd的左側)
$表示字元串末尾
- “cd”中的c與正則中的c*?進行比對,遊标繼續前進,
- “cd”中的d與c*?比對不上時,選用備選路線
- “cd”中的d與正則中的d對比并比對上
- ?=e不占用位置但是要校驗e值的存在(即遊标在d右側時,”cde”中e與?=e比對上,遊标不會移動)
類似?=e這種零位占用還有^,$
回溯
過程如下:
1. 由字元串”tea”左側開始,”tea” 的t 與 正則t比對
2. 忽略f?? 直接比對正則a,”tea”的”e” 與 正規表達式中”a” 對比,比對失敗
3. 正規表達式回溯到f??, 此時“tea”中的“e” 與正規表達式中“f??“對比,比對失敗
4. 正則模式繼續回退,此時正規表達式中t與字元串中”e“比較,比對失敗
對于??,是可優先忽略的
符号的運算優先級
優先級從高到低
操作符号 | 描述 |
---|---|
\ | 轉義符 |
(), (?:), (?=), [] | 圓括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \anymetacharacter | 位置和順序 |
| | “或”操作 |
正則常用符号及含義
普通字元
非列印字元
字元 | 含義 | 備注 |
---|---|---|
\f | 換頁符 | 等價于 \x0c 和 \cL |
\cx | 比對由x指明的控制字元 | \cM 比對一個 Control-M 或回車符 |
\n | 換行符 | 等價于 \x0a 和 \cJ |
\r | 比對一個回車符。 | 等價于 \x0d 和 \cM。 |
\s | 比對任何空白字元,包括空格、制表符、換頁符等等。 | 等價于 [ \f\n\r\t\v]。 |
\S | 比對任何非空白字元。 | 等價于 [^ \f\n\r\t\v]。 |
\t | 比對一個制表符。 | 等價于 \x09 和 \cI。 |
\v | 比對一個垂直制表符。 | 等價于 \x0b 和 \cK。 |
特殊字元
字元 | 含義 | 備注 |
---|---|---|
$ | 比對輸入字元串的結尾位置。 | 如果設定了 RegExp 對象的 Multiline 屬性,則 也比對‘\n′或‘\r′。要比對 也 匹 配 ‘ \n ′ 或 ‘ \r ′ 。 要 匹 配 字元本身,請使用 \$。 |
( ) | 标記一個子表達式的開始和結束位置。 | 子表達式可以擷取供以後使用。要比對這些字元,請使用 ( 和 )。 |
* | 比對前面的子表達式零次或多次。 | 要比對 * 字元,請使用 *。 |
+ | 比對前面的子表達式一次或多次。 | 要比對 + 字元,請使用 +。 |
. | 比對除換行符 \n之外的任何單字元。 | 要比對 .,請使用 \。 |
[ | 标記一個中括号表達式的開始。 | 要比對 [,請使用 [。 |
? | 比對前面的子表達式零次或一次,或指明一個非貪婪限定符。 | 要比對 ? 字元,請使用 \?。 |
\ | 将下一個字元标記為或特殊字元、或原義字元、或向後引用、或八進制轉義符。 | 例如, ‘n’ 比對字元 ‘n’。’\n’ 比對換行符。序列 ‘\’ 比對 “\”,而 ‘(’ 則比對 “(”。 |
^ | 比對輸入字元串的開始位置,除非在方括号表達式中使用,此時它表示不接受該字元集合。 | 要比對 ^ 字元本身,請使用 \^。 |
{ | 标記限定符表達式的開始。 | 要比對 {,請使用 \{。 |
| | 指明兩項之間的一個選擇。 | 要比對 |,請使用 \|。 |
定位符号
- ^
字元串以何元素開始
- $
字元串以什麼結束
- \b
描述單詞以何為邊界
- \B
描述單詞非邊界情況
用來描述字元串或單詞的邊界
限定符号
字元 | 含義 | 備注 |
---|---|---|
* | 比對前面的子表達式零次或多次。 | * 等價于{0,}。 |
+ | 比對前面的子表達式一次或多次。 | + 等價于 {1,}。 |
? | 比對前面的子表達式零次或一次。 | ? 等價于 {0,1}。 |
{n} | n 是一個非負整數。比對确定的 n 次。 | 例如,’o{2}’ 不能比對 “to” 中的 ‘o’,但是能比對 “tooth” 中的兩個 o。 |
{n,} | n 是一個非負整數。至少比對n 次。 | 例如,’o{2,}’ 不能比對 “to” 中的 ‘o’,但能比對 “foooood” 中的所有 o。’o{1,}’ 等價于 ‘o+’。’o{0,}’ 則等價于 ‘o*’。 |
{n,m} | m 和 n 均為非負整數,其中n <= m。最少比對 n 次且最多比對 m 次。 | 例如,”o{1,3}” 将比對 “fooooood” 中的前三個 o。’o{0,1}’ 等價于 ‘o?’。請注意在逗号和兩個數之間不能有空格。 |
字元簇
字元 | 含義 | 備注 |
---|---|---|
\d | 比對一個數字字元。 | 等價于 [0-9]。 |
\D | 比對一個非數字字元。 | 等價于 [^0-9]。 |
\w | 比對包括下劃線的任何單詞字元。 | 等價于’[A-Za-z0-9_]’。 |
\W | 比對任何非單詞字元。 | 等價于 ‘[^A-Za-z0-9_]’。 |
\num | 比對 num,其中 num 是一個正整數。對所擷取的比對的引用。 | 例如,’(.)\1′ 比對兩個連續的相同字元。 |
作者簡介:
就職于甜橙金融資訊技術部,負責前端開發工作,先後任職攜程,平安等公司的前端開發工程師職位,喜歡研究新的技術,服務于業務需求,熟練運用Linux/Unix系統指令,以終端為載體,快速執行操作。