溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

正則表達式的詳細介紹

發(fā)布時間:2020-07-03 17:09:24 來源:億速云 閱讀:186 作者:元一 欄目:編程語言

本篇文章給大家分享的是有關正則表達式的詳細介紹,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。

許多程序設計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通??s寫成“regex”,單數有regexp、regex,復數有regexps、regexes、regexen。

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

常見的元字符

字符描述特別說明
.匹配除換行符(\n)以外的任意字符~
[abcde]匹配 a b c d e 之中的任意一個字符所有字符是 的關系
[a-h]匹配 ah之間的任意一個字符~
[^fgh]不與 fgh之中的任意一個字符匹配在 中括號[ ] 的第一個字符前加上 ^ 表示 取反
不匹配中括號里面出現(xiàn)的任意字符
\w匹配大小寫英文字符及數字 0 到 9 之間的任意一個及下劃線,相當于[a-zA-Z0-9_]~
\W\w 相反,相當于 [^a-zA-Z0-9_]~
\s匹配任意的空白符,相當于 [\f\n\r\t\v]~
\S\s相反,相當于 [^\s]~
\d匹配任何 0 到 9 之間的單個數字,相當于 [0-9]~
\D\d 相反,相當于[^0-9]~
[\u4e00-\u9fa5]匹配任意單個漢字(中文)(這里用的是 Unicode 編碼表示的漢字)~
\b匹配單詞的開始或結束~
^匹配字符串的開始放在中括號的第一個字符前 則變?yōu)?取反的意思
$匹配字符串的結束~

正則表達式限定符

作用:限定這個符號前面 一個 單元 多出現(xiàn)的次數
單元:

  1. 如果前面出現(xiàn)的是一個字符的話,則這一個字符就為一個 單元
  2. 如果前面我們用小括號把一個很長的字符串括起來的話,那么整個小括號里面都算是一個 單元

上面的元字符都是針對單個字符匹配的,要想同時匹配多個字符的話,還需要借助限定符,下面是一些常見的限定符(下表中 n 和 m 都是表示 整數。)

字符描述特別說明
*匹配 0 到 多 個元字符,相當于 {0,}~
?匹配 0 到 1 個元字符, 相當于 {0,1}~
+匹配至少 1 個元字符,相當于 {1,}~
{n}匹配 n 個元字符~
{n,}匹配至少 n 個元字符~
{n,m}匹配 n 到 m 個元字符~
\b匹配單詞邊界~
^字符串必須以指定的字符開始~
$字符串必須以指定的字符結束~

說明 - 特例

  1. 可以將多個元字符或者原義文本字符用括號括起來形成一個 分組,比如 ^(13)[4-9]\d{8}$ 表示任意以 13 開頭的移動手機號碼。
    1. abcabcabc+  表示 最后的字母 c 出現(xiàn) 1 次或 多次;
    2. (abcabcabc)+ 表示 整個字符串 abcabcabc 出現(xiàn) 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. .? 出現(xiàn)在中括號中時,.? 將變?yōu)?普通字符,它就是 點 和 問號。你可以理解為 [ ] 的優(yōu)先級要大于. 和 ? 的優(yōu)先級。
    2. 此正則表達式將會完全匹配字符串 ?aaa.bbb ,記住這里 . 和 ? 被完全當做了普通字符。

高級1 - 多選結構

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

正則含義
Windows98|Windows2000|WindowsXP匹配Windows98或者Windows2000或者WindowsXP
^Windows98|Windows2000|WindowsXP$Windows98開頭或者包含Windows2000或者以WindowsXP結尾
注意^$都包含在|的范圍內,因為|的界限只有:開頭、結尾、小括號
Windows(98|2000|XP)Windows然后98 或者2000或者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?)

反向引用

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

示例:

  • \b(\w+)\b\s+\1\b 可以用來匹配重復的單詞
  • 匹配諸如:where where go, tom tom happy

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

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

  • 環(huán)視不匹配任何字符,只匹配文本中的 特定位置。類似于\b^、$ 那樣。環(huán)視不會占用字符。
  • 環(huán)視分為順序逆序兩種:
    • 順序
      • (?=exp) 位置的后面能匹配 exp。例如:(?=\d) 當前位置右邊是數字。
      • (?!exp) 位置的后面不能匹配 exp。例如:(?!\d) 當前位置右邊不是數字。
    • 逆序
      • (?<=exp) 位置的前面能匹配 exp。例如:(?<=\d) 當前位置左邊是數字
      • (?<!exp) 位置的前面不能匹配 exp。例如:(?!\d) 當前位置左邊不是數字。

高級4 - 貪婪與懶惰

  • 當正則表達式中包含能接受重復的 量詞 (指定數量的代碼,例如:+、*、{3,12} 等)時, 通常的行為是匹配盡可能多的字符
  • 正則表達式:a.*b,它將會匹配最長的以 a 開始,以 b 結束的字符串。如果用它來搜索 aabab 的話,它會匹配整個字符串 aabab,這被稱為 -------貪婪匹配
  • -
  • 我們更需要 懶惰匹配,也就是匹配盡可能少的字符,前面給出的量詞都可以被轉化為 懶惰匹配模式, 只要在它后面加一個問號 ? 。這樣 .*? 就意味著匹配任意數量的重復,但是在能使整個 匹配成功的前提下使用最少的重復。
  • a.*?b 匹配最短的,以 a 開始, 以 b 結束的字符串。如果把它應用于 aabab 的話,它會匹配 aabab。

總結:

貪婪與懶惰模式之間的區(qū)別就在于:懶惰模式 在量詞 * 的后面多了一個 問號 ?

高級5 - 模式匹配的優(yōu)先級

在使用正則表達式時,需要注意匹配的順序。通常相同優(yōu)先級 從左到右 進行計算,不同優(yōu)先級的運算 先高后低。各種操作符的匹配順序優(yōu)先級 從高到低 如下表所示。

順序元字符描述
1\轉義字符
2()、(?:)、(?=)、[]模式單元和原子表
3*、+?、{n}、{n,}、{n,m}重復匹配
4^、$\b、\B、\A\Z邊界限制
5|模式選擇

實例

1. 字符轉義

1問:要匹配字符串 333333\$33\33333 中的 \$ 正則應該怎么寫?
2問:如果在 PHP 中 preg_match 函數分別用單引號雙引號的表達式來匹配上面的 \$,怎么寫?

答案:

  • 表達式需要的規(guī)則是 \\\$
  • 用單引號表示上面的字符串 '/\\\\\\$/'。(為方便查看我們拆分一下為 '/\\  \\  \\  $/'
  • 用雙引號表示上面的字符串 "/\\\\\\\$/"。(為方便查看我們拆分一下為 "/\\  \\  \\  \$/"
  • 問什么呢?

再答:

  1. PHP 中單引號不轉義任何字符,但是唯獨轉義 \ ,所以我們需要 6個\ 來生成表達式。
  2. 雙引號除了轉義 \ 以外,還需要多一個 \ 用來轉義 $ 所以它 需要 7 個\

以上就是正則表達式的詳細介紹,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI