天天看點

正規表達式--内功心法

    • 目的或意義
    • 概念
    • 應用場景
    • 正反向預查
    • 非貪婪模式 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的正則引擎有一個特點:遞歸和回溯

遞歸

  1. ^表示起始位置0(即字元串cd的左側)
    $表示字元串末尾
  2. “cd”中的c與正則中的c*?進行比對,遊标繼續前進,
  3. “cd”中的d與c*?比對不上時,選用備選路線
  4. “cd”中的d與正則中的d對比并比對上
  5. ?=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系統指令,以終端為載體,快速執行操作。

繼續閱讀