新聞中心
本篇文章給大家分享的是有關(guān)正則表達式的詳細介紹,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。
許多程序設(shè)計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內(nèi)建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數(shù)有regexp、regex,復數(shù)有regexps、regexes、regexen。
元字符使用正則表達式具有處理能力。元字符既可以是放在[ ]
中的任意單個字符(如 [a]
表示匹配單個小寫字符 a
),也可以是字符序列(如 [a-d]
表示匹配 a 、b、 c、 d
之間的任意一個字符,而 \w
表示任意英文字母和數(shù)字及下劃線),常見的元字符如下:
字符 | 描述 | 特別說明 |
---|---|---|
. | 匹配除換行符(\n )以外的任意字符 | ~ |
[abcde] | 匹配 a b c d e 之中的任意一個字符 | 所有字符是 或 的關(guān)系 |
[a-h] | 匹配 a 到h 之間的任意一個字符 | ~ |
[^fgh] | 不與 fgh 之中的任意一個字符匹配 | 在 中括號[ ] 的第一個字符前加上 ^ 表示 取反不匹配中括號里面出現(xiàn)的任意字符 |
\w | 匹配大小寫英文字符及數(shù)字 0 到 9 之間的任意一個及下劃線,相當于[a-zA-Z0-9_] | ~ |
\W | 與 \w 相反,相當于 [^a-zA-Z0-9_] | ~ |
\s | 匹配任意的空白符,相當于 [\f\n\r\t\v] | ~ |
\S | 與 \s 相反,相當于 [^\s] | ~ |
\d | 匹配任何 0 到 9 之間的單個數(shù)字,相當于 [0-9] | ~ |
\D | 與 \d 相反,相當于[^0-9] | ~ |
[\u4e00-\u9fa5] | 匹配任意單個漢字(中文)(這里用的是 Unicode 編碼表示的漢字) | ~ |
\b | 匹配單詞的開始或結(jié)束 | ~ |
^ | 匹配字符串的開始 | 放在中括號的第一個字符前 則變?yōu)?取反的意思 |
$ | 匹配字符串的結(jié)束 | ~ |
作用:限定這個符號前面 一個 單元 多出現(xiàn)的次數(shù)
單元:
- 如果前面出現(xiàn)的是一個字符的話,則這一個字符就為一個 單元
- 如果前面我們用小括號把一個很長的字符串括起來的話,那么整個小括號里面都算是一個 單元
上面的元字符都是針對單個字符匹配的,要想同時匹配多個字符的話,還需要借助限定符,下面是一些常見的限定符(下表中 n
和 m 都是表示 整數(shù)。)
字符 | 描述 | 特別說明 |
---|---|---|
* | 匹配 0 到 多 個元字符,相當于 {0,} | ~ |
? | 匹配 0 到 1 個元字符, 相當于 {0,1} | ~ |
+ | 匹配至少 1 個元字符,相當于 {1,} | ~ |
{n} | 匹配 n 個元字符 | ~ |
{n,} | 匹配至少 n 個元字符 | ~ |
{n,m} | 匹配 n 到 m 個元字符 | ~ |
\b | 匹配單詞邊界 | ~ |
^ | 字符串必須以指定的字符開始 | ~ |
$ | 字符串必須以指定的字符結(jié)束 | ~ |
- 可以將多個元字符或者原義文本字符用括號括起來形成一個
分組
,比如^(13)[4-9]\d{8}$
表示任意以 13 開頭的移動手機號碼。abcabcabc+
表示 最后的字母c
出現(xiàn) 1 次或 多次;(abcabcabc)+
表示 整個字符串abcabcabc
出現(xiàn) 1 次或 多次。
- 可以使用
|
來表示或
的關(guān)系,例如z|j|q
表示匹配z 、j、q
之中的任意一個字母。其實等價于[zjq]
。ab|cd|ef
表示的是:要么是ab
、要么是cd
要么是ef
。a(b|cd|e)f
表示的是:以a
開頭,要么是b
、要么是cd
要么是e
,最后以f
結(jié)尾。- 總結(jié):
|
(或
) 的唯一邊界是 小括號(( )
)
[0-9A-Z.?]
這個正則你如何理解?- 當
.
和?
出現(xiàn)在中括號中時,.
和?
將變?yōu)?普通字符,它就是 點 和 問號。你可以理解為[ ]
的優(yōu)先級要大于. 和 ?
的優(yōu)先級。 - 此正則表達式將會完全匹配字符串
?aaa.bbb
,記住這里. 和 ?
被完全當做了普通字符。
- 當
多選結(jié)構(gòu)其實就是元字符 |
(或)的使用。
界定范圍:開頭、結(jié)尾、小括號
正則 | 含義 |
---|---|
Windows98|Windows2000|WindowsXP | 匹配Windows98 或者Windows2000 或者WindowsXP |
^Windows98|Windows2000|WindowsXP$ | 以Windows98 開頭或者包含Windows2000 或者以WindowsXP結(jié)尾注意 ^ 和$ 都包含在| 的范圍內(nèi),因為| 的界限只有:開頭、結(jié)尾、小括號 |
Windows(98|2000|XP) | Windows 然后98 或者2000 或者XP |
總結(jié):多選結(jié)構(gòu)可以包括很多字符,但不能超越 括號
的界限。
- 我們已經(jīng)了解怎么重復單個字符;
- 但如果想要重復一個字符串該怎么辦?你 可以用小括號來指定子表達式(也叫做分組)。
(\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
直白解釋:
正則表達式中,前面用小括號進行劃分(分組),后面把小括號匹配到的內(nèi)容引用到后面來,分別用\1
、\2
等 來表示。(第一個小括號極\1
...)。如果存在 小括號嵌套小括號的情況 (\w+(.?))
記?。哼@個時候要以 (
為標志 從左往右 數(shù)小括號就可以了。
- 環(huán)視不匹配任何字符,只匹配文本中的 特定位置。類似于
\b
、^
、$
那樣。環(huán)視不會占用字符。 - 環(huán)視分為順序和逆序兩種:
- 順序
(?=exp)
位置的后面能匹配exp
。例如:(?=\d)
當前位置右邊是數(shù)字。(?!exp)
位置的后面不能匹配exp
。例如:(?!\d)
當前位置右邊不是數(shù)字。
- 逆序
(?<=exp)
位置的前面能匹配exp
。例如:(?<=\d)
當前位置左邊是數(shù)字(? 位置的前面不能匹配
exp
。例如:(?!\d)
當前位置左邊不是數(shù)字。
- 順序
高級4 - 貪婪與懶惰- 當正則表達式中包含能接受重復的 量詞 (指定數(shù)量的代碼,例如:
+
、*
、{3,12}
等)時, 通常的行為是匹配盡可能多的字符。 - 正則表達式:
a.*b
,它將會匹配最長的以 a
開始,以 b
結(jié)束的字符串。如果用它來搜索 aabab
的話,它會匹配整個字符串 aabab
,這被稱為 -------貪婪匹配 - -
- 我們更需要 懶惰匹配,也就是匹配盡可能少的字符,前面給出的量詞都可以被轉(zhuǎn)化為 懶惰匹配模式, 只要在它后面加一個問號
?
。這樣 .*?
就意味著匹配任意數(shù)量的重復,但是在能使整個 匹配成功的前提下使用最少的重復。 a.*?b
匹配最短的,以 a
開始, 以 b
結(jié)束的字符串。如果把它應(yīng)用于 aabab
的話,它會匹配 aab
和 ab
。
總結(jié):
貪婪與懶惰模式之間的區(qū)別就在于:懶惰模式 在量詞 *
的后面多了一個 問號 ?
。
高級5 - 模式匹配的優(yōu)先級在使用正則表達式時,需要注意匹配的順序。通常相同優(yōu)先級 從左到右 進行計算,不同優(yōu)先級的運算 先高后低。各種操作符的匹配順序優(yōu)先級 從高到低 如下表所示。
順序 元字符 描述 1 \
轉(zhuǎn)義字符 2 ()
、(?:)
、(?=)
、[]
模式單元和原子表 3 *
、+
、?
、{n}
、{n,}
、{n,m}
重復匹配 4 ^
、$
、\b
、\B
、\A
、\Z
邊界限制 5 |
模式選擇
實例1. 字符轉(zhuǎn)義1問:要匹配字符串 333333\$33\33333
中的 \$
正則應(yīng)該怎么寫?
2問:如果在 PHP 中 preg_match
函數(shù)分別用單引號和雙引號的表達式來匹配上面的 \$
,怎么寫?
答案:
- 表達式需要的規(guī)則是
\\\$
- 用單引號表示上面的字符串
'/\\\\\\$/'
。(為方便查看我們拆分一下為 '/\\ \\ \\ $/'
) - 用雙引號表示上面的字符串
"/\\\\\\\$/"
。(為方便查看我們拆分一下為 "/\\ \\ \\ \$/"
) - 問什么呢?
再答:
- PHP 中單引號不轉(zhuǎn)義任何字符,但是唯獨轉(zhuǎn)義
\
,所以我們需要 6個\
來生成表達式。 雙引號除了轉(zhuǎn)義 \
以外,還需要多一個 \
用來轉(zhuǎn)義 $
所以它 需要 7 個\
。
以上就是正則表達式的詳細介紹,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
分享名稱:正則表達式的詳細介紹-創(chuàng)新互聯(lián)
文章出自:http://fisionsoft.com.cn/article/spjhh.html