摘要:對(duì)于任何有過(guò)編程經(jīng)驗(yàn)的人來(lái)說(shuō),他對(duì)正則表達(dá)式應(yīng)該不會(huì)感到陌生。元字符正則表達(dá)式的威力源于它可以在模式中擁有選擇和重復(fù)的能力。一些字符被賦予特殊的涵義,使其不再單純的代表自己,模式中的這種有特殊涵義的編碼字符稱為元字符。
對(duì)于任何有過(guò)編程經(jīng)驗(yàn)的人來(lái)說(shuō),他對(duì)正則表達(dá)式應(yīng)該不會(huì)感到陌生。
正則表達(dá)式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來(lái)檢查一個(gè)串是否含有某種子串、將匹配的子串替換或者從某個(gè)串中取出符合某個(gè)條件的子串等。
平時(shí)沒(méi)有系統(tǒng)地學(xué)習(xí)過(guò)正則表達(dá)式的知識(shí),多數(shù)情況都是在使用到時(shí),才會(huì)查找相關(guān)的語(yǔ)法來(lái)實(shí)現(xiàn)需求。最近對(duì) PHP 的正則表達(dá)式進(jìn)行了一次主題閱讀,收獲良多,特意寫篇筆記記錄下來(lái)。
PHP 中有兩種類型的函數(shù)來(lái)處理正則表達(dá)式,一種是由 PCRE 庫(kù)提供的函數(shù),它們是以 preg_ 前綴開頭的;另一種是 由 POSIX 擴(kuò)展提供的函數(shù),它們是以 ereg_ 前綴開頭。但是從 PHP5.3.0 開始后者便不再建議使用,故而以下的知識(shí)都是針對(duì) PCRE 模式的。
PHP 中的正則表達(dá)式由以下三部分組成:
分隔符
表達(dá)式
修飾符
例如:
/[a-zA-Z0-9-_]+/m
上面的例子當(dāng)中:
字符串收尾的 / 屬于正則表達(dá)式的分隔符,它可以是任意的非字母數(shù)字、非反斜線、非空白字符;
分隔符中間部分 [a-zA-Z0-9-_]+ 屬于正則表達(dá)式的表達(dá)式;
正則表達(dá)式最后的部分 m 是修飾符,這里的 m 表示多行選擇。
正則表達(dá)式的威力源于它可以在模式中擁有選擇和重復(fù)的能力。 一些字符被賦予 特殊的涵義,使其不再單純的代表自己,模式中的這種有特殊涵義的編碼字符 稱為 元字符。
元字符 | 含義 |
一般用于轉(zhuǎn)義字符 | |
^ | 斷言目標(biāo)的開始位置(或在多行模式下是行首) |
$ | 斷言目標(biāo)的結(jié)束位置(或在多行模式下是行尾) |
. | 匹配除換行符外的任何字符(默認(rèn)) |
[ | 開始字符類定義 |
] | 結(jié)束字符類定義 |
| | 開始一個(gè)可選分支 |
( | 子組的開始標(biāo)記 |
) | 子組的結(jié)束標(biāo)記 |
? | 作為量詞,表示 0 次或 1 次匹配。位于量詞后面用于改變量詞的貪婪特性。 (查閱量詞) |
* | 量詞,0 次或多次匹配 |
+ | 量詞,1 次或多次匹配 |
{ | 自定義量詞開始標(biāo)記 |
} | 自定義量詞結(jié)束標(biāo)記 |
字符類(方括號(hào))
左方括號(hào)開始一個(gè)字符類的描述,并以方中括號(hào)結(jié)束。 多帶帶的一個(gè)右方括號(hào)沒(méi)有特殊含義。如果一個(gè)右方括號(hào)需要作為一個(gè)字符類中的成員, 那么可以將它寫在字符類的首字符處(如果使用了^取反, 那么是第二個(gè))或者使用轉(zhuǎn)義符。
一個(gè)字符類在目標(biāo)字符串中匹配一個(gè)多帶帶的字符; 該字符必須是字符類中定義的字符集合的其中一個(gè), 除非使用了 ^ 對(duì)字符類取反。例如:
[d] 匹配所有的數(shù)字
[^d] 匹配所有的數(shù)字之外的字符
可選路徑(|)
豎線字符用于分離模式中的可選路徑。 豎線可以在模式中出現(xiàn)任意多個(gè),并且允許有空的可選路徑(匹配空字符串)。 匹配的處理從左到右嘗試每一個(gè)可選路徑,并且使用第一個(gè)成功匹配的。
比如:
模式 gilbert|Sullivan 匹配 gilbert 或者 sullivan。
子組(子模式)
子組通過(guò)圓括號(hào)分隔界定,并且它們可以嵌套。子組具有兩個(gè)作用:
1、 將可選分支局部化;
2、 將子組設(shè)定為捕獲子組。比如:
模式 cat(arcat|erpillar|) 匹配 cat,cataract, caterpillar 中的一個(gè)
后向引用
在反斜線后面加一個(gè)大于零的數(shù)字可以引用模式前面捕獲的內(nèi)容,這叫做后向引用。
如果緊跟反斜線的數(shù)字小于 10, 它總是一個(gè)后向引用, 并且如果在模式中沒(méi)有這么多的捕獲組會(huì)引發(fā)一個(gè)錯(cuò)誤。例如:
模式 (sens|respons)e and 1ibility 將會(huì)匹配 sense and sensibility 和 response and responsibility, 但不會(huì)匹配 sense and responsibility。
斷言
一個(gè)斷言就是一個(gè)對(duì)當(dāng)前匹配位置之前或之后的字符的測(cè)試, 它不會(huì)實(shí)際消耗任何字符。它有兩種類型: 前瞻斷言(從當(dāng)前位置向前測(cè)試)和后瞻斷言(從當(dāng)前位置向后測(cè)試);每個(gè)類型又有肯定斷言和否定斷言之分。
所以共有以下四種斷言:
1、前瞻肯定斷言 (?=
2、前瞻否定斷言 (?!
3、后瞻肯定斷言 (?<=
4、后瞻否定斷言 (?例如:
w+(?=;) 匹配一個(gè)單詞緊跟著一個(gè)分號(hào)但是匹配結(jié)果不會(huì)包含分號(hào)
foo(?!bar) 匹配所有后面沒(méi)有緊跟 bar 的 foo 字符串
(? 用于查找任何前面不是 foo 的 bar
當(dāng)正則表達(dá)式中包含能接受重復(fù)的限定符時(shí),默認(rèn)的行為是(在使整個(gè)表達(dá)式能得到匹配的前提下)匹配盡可能多的字符。這被稱為貪婪匹配。
例如:
以 a.*b 來(lái)搜索 aabab 時(shí),它會(huì)匹配整個(gè)字符串 aabab。
可是我們的需求并非一直是要貪婪匹配的,有時(shí)候也會(huì)選擇懶惰的匹配模式。其實(shí)在量詞后面緊跟著 ? 即為懶惰模式。*? +? {n,m}? 皆為懶惰匹配。
例如:
以 a.*?b 來(lái)搜索 aabab 時(shí),它會(huì)匹配字符串 aab 和 ab。
i 忽略大小寫模式
m 多行模式
s 點(diǎn)號(hào)通配模式
U 懶惰模式
D 結(jié)尾限制
u 支持 UTF-8 轉(zhuǎn)義表達(dá)
http://php.net/manual/zh/book...
https://regex101.com/
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/25943.html
摘要:兼容的正則表達(dá)式已經(jīng)實(shí)現(xiàn)了很多使用不同解析引擎的正則函數(shù)。中主要有兩個(gè)正則解析器一個(gè)稱為,另一個(gè)稱為兼容正則表達(dá)式。在中,每個(gè)正則表達(dá)式模式都是使用符合格式的字符串。 原文鏈接: Getting Started with PHP Regular Expressions Last-Modified: 2019年5月10日16:23:19譯者注: 本文是面向0正則基礎(chǔ)的phper, 很多...
摘要:規(guī)范為的縮寫,中文即兼容正則表達(dá)式,由開發(fā)的庫(kù),為很多現(xiàn)代工具所使用,大多數(shù)編程語(yǔ)言的正則表達(dá)式也都是集成該規(guī)范。接下來(lái)本文會(huì)對(duì)規(guī)范的正則表達(dá)式作出詳細(xì)介紹。正則語(yǔ)法分隔符當(dāng)使用函數(shù)的時(shí)候,模式需要由分隔符閉合包裹。 概述 正則表達(dá)式(Regular Expression)是一種字符匹配工具,通過(guò)構(gòu)建具有特定規(guī)則的模式,和輸入字符串?dāng)?shù)據(jù)進(jìn)行比較,然后進(jìn)行匹配、分割、替換等等的相關(guān)操作。...
摘要:正則表達(dá)式的都是匹配和替換搜索正則表達(dá)式要匹配的字符串匹配到的字符串匹配到的個(gè)數(shù),沒(méi)有匹配到返回下面是例子執(zhí)行一個(gè)正則表達(dá)式匹配,非貪婪執(zhí)行一個(gè)全局正則表達(dá)式匹配,貪婪執(zhí)行結(jié)果匹配所有僅由有一個(gè)單詞組成的科目名輸出結(jié)果替換正則表達(dá)式要匹 正則表達(dá)式的都是匹配和替換 PHP 搜索 preg_match* /** * int preg_match* ( string $pattern ,...
摘要:正則表達(dá)式的都是匹配和替換搜索正則表達(dá)式要匹配的字符串匹配到的字符串匹配到的個(gè)數(shù),沒(méi)有匹配到返回下面是例子執(zhí)行一個(gè)正則表達(dá)式匹配,非貪婪執(zhí)行一個(gè)全局正則表達(dá)式匹配,貪婪執(zhí)行結(jié)果匹配所有僅由有一個(gè)單詞組成的科目名輸出結(jié)果替換正則表達(dá)式要匹 正則表達(dá)式的都是匹配和替換 PHP 搜索 preg_match* /** * int preg_match* ( string $pattern ,...
摘要:在閱讀這篇文章前最好把同系列文章實(shí)戰(zhàn)正則表達(dá)式一驗(yàn)證手機(jī)號(hào)先仔細(xì)閱讀一遍。但實(shí)際上這樣一個(gè)表達(dá)式是無(wú)法從上面的中提取第一個(gè)元素的這里主要的問(wèn)題是在默認(rèn)情況下點(diǎn)號(hào)字符無(wú)法匹配換行符。但是很遺憾,正則表達(dá)式中沒(méi)有排除型子表達(dá)式或者說(shuō)排除型分組。 這篇文章通過(guò)提取html元素介紹了正則表達(dá)式中模式修飾符、貪婪匹配與非貪婪匹配、Unicode模式、環(huán)視等知識(shí)點(diǎn)。在閱讀這篇文章前最好把同系列文章...
摘要:正則表達(dá)式是什么是一種字符串處理的工具搜索匹配搜索替換搜索分割功能強(qiáng)大是一種規(guī)則正則表達(dá)式應(yīng)用范圍數(shù)據(jù)驗(yàn)證數(shù)據(jù)處理過(guò)濾數(shù)據(jù)查詢各語(yǔ)言都支持正則表達(dá)式相關(guān)函數(shù)正則表達(dá)式一個(gè)匹配返回匹配結(jié)果的次數(shù)執(zhí)行一個(gè)全局正則表達(dá)式匹配返回匹配結(jié)果的次數(shù) 正則表達(dá)式是什么 是一種字符串處理的工具(搜索匹配、搜索替換、搜索分割) 功能強(qiáng)大,是一種規(guī)則 正則表達(dá)式應(yīng)用范圍 數(shù)據(jù)驗(yàn)證 數(shù)據(jù)處理/過(guò)濾 數(shù)...
閱讀 2594·2021-09-22 15:15
閱讀 727·2021-09-02 15:11
閱讀 1915·2021-08-30 09:48
閱讀 1965·2019-08-30 15:56
閱讀 1606·2019-08-30 15:52
閱讀 2149·2019-08-30 15:44
閱讀 510·2019-08-29 16:29
閱讀 1607·2019-08-29 11:06