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