首頁  >  文章  >  後端開發  >  詳解正規表示式

詳解正規表示式

步履不停
步履不停原創
2019-07-01 16:25:525498瀏覽

詳解正規表示式

正規表示式語言由兩種基本字元類型組成:原義(正常)文字字元和元字元。

相關推薦:
1. 正規表示式語法教學(含線上測試工具)
2. PHP正規表示式極速入門影片教學

元字元使用正規表示式具有處理能力。元字元既可以是放在[ ] 中的任意單一字元(如[a]表示符合單一小寫字元a),也可以是字元序列(如[a-d] 表示匹配a 、b、 c、 d 之間的任一個字符,而\w 表示任意英文字母和數字及下劃線),常見的元字元如下:

常見的元字元

##特別說明匹配除換行符(~#符合#所有字元是已匹配~不與在中括號符合大小寫英文字元及數字0 到9之間的任一及底線,相當於#~##\W\w\s\S相反,相當於\d\D 相反,相當於[\u4e00-\u9fa5]Unicode
字元 描述
. \n)以外的任意字元
[abcde] a b c d e 之中的任一字元 的關係
[a-h] a# h之間的任一個字元
[^fgh] fgh之中的任一個字元符合 [ ] 的第一個字元前加上^ 表示取反# 不符合中括號裡面出現的任意字元
\w [a-zA-Z0-9_]
相反,相當於[^a-zA-Z0-9_]##~~
符合任意的空白符,相當於[\f\n\r\t\v] #~
\s[^\s] ~
#符合任何0 到9 之間的單一數字,相當於[0-9] ~
\d[^0-9]~
符合任意單一漢字(中文)(這裡用的是 編碼表示的漢字) ~


  1. ##\b
  2. 匹配單字的開始或結束
  3. ~

^#符合字串的開始

放在中括號的第一個字元前則變成取反的意思符合字串的結束~單元 多出現的次數單元 和m 都是表示字元{0,}~?{0,1}#符合至少1 個元字符,相當於{1,}#{n}符合至少n 元字元
$
#正規表示式限定符 ##作用:限定這個符號前面一個
單元: 如果前面出現的是一個字元的話,則這一個字元就為一個單元 如果前面我們用小括號把一個很長的字串括起來的話,那麼整個小括號裡面都算是一個
上面的元字元都是針對單一字元匹配的,要同時符合多個字元的話,還需要藉助限定符,以下是一些常見的限定符(下表中n 整數。 )
描述#特別說明
##* 符合0 到多個元字符,相當於
符合0 到1 元字符,相當於
~
~
匹配n 元字元~ ##{n, }
###~###############{n,m}######## ##匹配n 到m 個元字元######~################\b######### 匹配單字邊界###### ~###############^#########字串必須以指定的字元開始######~########## ######$#########字串必須以指定的字元結束######~############

說明- 特例

  1. 可以將多個元字元或原義文字字元用括號括起來形成一個分組,例如 ^(13)[4-9]\d{8}$ 表示任意以13 開頭的行動手機號碼。
    1. abcabcabc  表示最後的字母c 出現1 次或多次;
    2. (abcabcabc) 表示整個字串abcabcabc 出現1 次或多次。
  2. 可以使用| 來表示 的關係,例如z|j|q 表示符合 z 、j、q 之中的任一個字母。其實等價於 [zjq]
    1. ab|cd|ef 表示的是:要嘛是 ab、要嘛是 cd要嘛是 ef#。
    2. a(b|cd|e)f 表示的是:以a開頭,要嘛是b、要嘛是cd要嘛是e,最後以f結尾。
    3. 總結:|) 的唯一邊界是小括號( )
  3. [0-9A-Z.?] 這個正規你如何理解?
    1. .? 出現在括號中括號時,.?將變成普通字元,它就是點和問號。你可以理解為 [ ] 的優先權要大於. 和 ? 的優先權。
    2. 此正規表示式將會完全符合字串 ?aaa.bbb ,記住這裡 . 和 ? 被完全當做了普通字元。

進階1 - 多重選取結構

多重選取結構其實就是元字元 | (或)的使用。
界定範圍:開頭、結尾、小括號

##意思#Windows98或Windows2000$都包含在|98 或2000
正規
#Windows98|Windows2000|WindowsXP符合
WindowsXP #^Windows98|Windows2000|WindowsXP$
#以Windows98開頭或包含Windows2000或以WindowsXP結尾#注意^
的範圍內,因為|的界線只有:開頭、結尾、小括號 Windows(98|2000|XP)#Windows然後
或###XP################

總結:多選結構可以包括很多字符,但不能超越 括號 的界限。

進階2 - 分組與後向引用

分組

  • 我們已經了解怎麼重複單一字元;
  • 但如果想要重複一個字串該怎麼辦?你 可以用小括號來指定子表達式(也叫做分組)
  • (\d{1,3}\.){3}\d{1,3} 簡單的IP 位址匹配表達式
  • 但是它也將符合256.300.888.999 這種不可能存在的IP 位址。你能寫出一個更準確的正規則?
  • ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4] \d|25[0-5]|[01]?\d\d?)

#反向引用

  • 使用小括號指定一個子表達式(分組)後,匹配這個子表達式的文字可以被捕獲,從而在表達式或其他程式中作進一步的處理。
  • 預設情況下,每個分組會自動擁有一個群組號,規則是:以分組的左括號為標誌,從左到右,第一個分組的組號為1 ,第二個為2 ,依次類別推

範例:

  • \b(\w )\b\s \1\b 可以用來符合重複的單字
  • 符合諸如:where where go, tom tom happy

直白解釋:##在正規表示式中,前面用小括號進行分割(分組),後面把小括號匹配到的內容
引用到後面來,分別用\1\2等來表示。 (第一個小括號極\1...)。如果存在小括號嵌套小括號的情況(\w (.?)) 記住:這個時候要以( 為標誌從左往右數小括號就可以了。

高級3 - 環視(零寬斷言)

    環視不匹配任何字符,只匹配文本中的
  • 特定位置。類似於 \b^$ 那樣。 環視不會佔用字元。
  • 環分為
  • 順序逆序兩種:
      順序
      • (?=exp) 位置的後面能匹配 exp 。例如:(?=\d) 目前位置右邊是數字。
      • (?!exp) 位置的後面不能符合 exp。例如:(?!\d) 目前位置右邊不是數字。
      ##逆序
      • (?<=exp)
      • 位置的前面可以符合 exp。例如:(?<=\d) 目前位置左邊是數字
      • (? 位置的前面不能符合 exp。例如:(?!\d ) 目前位置左邊不是數字。
  • #進階4 - 貪婪與懶惰

當正規表示式中包含能接受重複的
    量詞
  • (指定數量的程式碼,例如: *{3,12} 等)時,通常的行為是匹配盡可能多的字元 正規表示式:
  • a.*b
  • ,它將匹配最長的字元以a 開始,以b 結束的字串。如果用它來搜尋aabab 的話,它會符合整個字串aabab,這稱為-- -----貪婪匹配-
  • 我們更需要
  • 懶惰匹配
  • ,也就是匹配盡可能少的字符,前面給出的量詞都可以轉換成懶惰匹配模式,只要在它後面加上一個問號? 。這樣.*? 就表示符合任意數量的重複,但是在能使整個匹配成功的前提下使用最少的重複
  • #a.*?b
  • 匹配最短的,以a 開始, 以b 結束的字串。如果把它套用到 aabab 的話,它會符合 aabab
  • 總結:

貪婪與懶惰模式之間的差異就在於:
懶惰模式

在量詞* 的後面多了一個問號?

進階5 - 模式匹配的優先權

在使用正規表示式時,需要注意匹配的順序。通常相同優先權

從左到右

進行計算,不同優先權的運算 先高後低。各種運算子的符合順序優先權 從高到低 如下表所示。

##1\#轉義字元[] #模式單元與原子表{n,m}#重複對\Z邊界限制##5|
元字元 描述
2 ()(?:)(?=)
3* {n}{n,}
#4^$\b\B\A


#模式選擇

實例

1. 字元轉義

1問:要符合字串
    333333\$33\ 33333
  • 中的\$ 正規該怎麼寫?
  • 2問:如果在PHP 中
  • preg_match 函數分別用單引號雙引號
  • 的表達式來符合上面的
  • \$,怎麼寫? 答案:
表達式所需的規則是

\\\$

用單引號表示上面的字串
    '/\\\\\\$/'
  1. 。 (為方便查看我們拆分一下為'/\\  \\  \\  $/'以雙引號表示上面的字串
  2. "/\\\\ \\\$/"
  3. 。 (為方便檢查我們拆分一下為

    "/\\  \\  \\  \$/"問什麼呢? 再答:

PHP 中單引號不轉義任何字符,但是唯獨轉義

\ ,所以我們需要6個\

來產生表達式。 #########雙引號除了轉義###\### 以外,還需要多一個###\### 用來轉義###$### 所以它需要7 個###\###。 ############相關教學推薦:###PHP影片教學######

以上是詳解正規表示式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn