正則表達(dá)式,又稱規(guī)則表達(dá)式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表通常被用來檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。
正則表達(dá)式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。
許多程序設(shè)計(jì)語言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎。正則表達(dá)式這個(gè)概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達(dá)式通??s寫成“regex”,單數(shù)有regexp、regex,復(fù)數(shù)有regexps、regexes、regexen。
第一個(gè)正則表達(dá)式實(shí)例!
實(shí)例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>PHP中文網(wǎng)教程(php.sn)</title> </head> <body> <script> var str = "abc123def"; var patt1 = /[0-9]+/; document.write(str.match(patt1)); </script> </body> </html>
運(yùn)行實(shí)例 ?
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
提示:我們的正則表達(dá)式教程將幫助您學(xué)習(xí)從初級到高級的正則表達(dá)式知識。如果你有任何疑問,請前往PHP中文網(wǎng)正則表達(dá)式社區(qū)提出你的問題,會(huì)有熱心網(wǎng)友為你解答。
正則表達(dá)式特點(diǎn)
靈活性、邏輯性和功能性非常強(qiáng);
可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制。
對于剛接觸的人來說,比較晦澀難懂。
由于正則表達(dá)式主要應(yīng)用對象是文本,因此它在各種文本編輯器場合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達(dá)式來處理文本內(nèi)容。
目的
給定一個(gè)正則表達(dá)式和另一個(gè)字符串,我們可以達(dá)到如下的目的:
給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作“匹配”)
可以通過正則表達(dá)式,從字符串中獲取我們想要的特定部分。
正則引擎
正則引擎主要可以分為兩大類:
一種是DFA,
一種是NFA。
這兩種引擎都有了很久的歷史(至今二十多年),當(dāng)中也由這兩種引擎產(chǎn)生了很多變體!于是POSIX的出臺規(guī)避了不必要變體的繼續(xù)產(chǎn)生。這樣一來,主流的正則引擎又分為3類:一、DFA,二、傳統(tǒng)型NFA,三、POSIX NFA。
DFA 引擎在線性時(shí)狀態(tài)下執(zhí)行,因?yàn)樗鼈儾灰蠡厮荩ú⒁虼怂鼈冇肋h(yuǎn)不測試相同的字符兩次)。DFA 引擎還可以確保匹配最長的可能的字符串。但是,因?yàn)?DFA 引擎只包含有限的狀態(tài),所以它不能匹配具有反向引用的模式;并且因?yàn)樗粯?gòu)造顯示擴(kuò)展,所以它不可以捕獲子表達(dá)式。
傳統(tǒng)的 NFA 引擎運(yùn)行所謂的“貪婪的”匹配回溯算法,以指定順序測試正則表達(dá)式的所有可能的擴(kuò)展并接受第一個(gè)匹配項(xiàng)。因?yàn)閭鹘y(tǒng)的 NFA 構(gòu)造正則表達(dá)式的特定擴(kuò)展以獲得成功的匹配,所以它可以捕獲子表達(dá)式匹配和匹配的反向引用。但是,因?yàn)閭鹘y(tǒng)的 NFA 回溯,所以它可以訪問完全相同的狀態(tài)多次(如果通過不同的路徑到達(dá)該狀態(tài))。因此,在最壞情況下,它的執(zhí)行速度可能非常慢。因?yàn)閭鹘y(tǒng)的 NFA 接受它找到的第一個(gè)匹配,所以它還可能會(huì)導(dǎo)致其他(可能更長)匹配未被發(fā)現(xiàn)。
POSIX NFA 引擎與傳統(tǒng)的 NFA 引擎類似,不同的一點(diǎn)在于:在它們可以確保已找到了可能的最長的匹配之前,它們將繼續(xù)回溯。因此,POSIX NFA 引擎的速度慢于傳統(tǒng)的 NFA 引擎;并且在使用 POSIX NFA 時(shí),您恐怕不會(huì)愿意在更改回溯搜索的順序的情況下來支持較短的匹配搜索,而非較長的匹配搜索。
使用DFA引擎的程序主要有:
awk,egrep,flex,lex,MySQL,Procmail等;
使用傳統(tǒng)型NFA引擎的程序主要有:
GNU Emacs,Java,ergp,less,more,.NET語言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;
使用POSIX NFA引擎的程序主要有:
mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用時(shí)可以明確指定);
也有使用DFA/NFA混合的引擎:
GNU awk,GNU grep/egrep,Tcl。
舉例簡單說明NFA與DFA工作的區(qū)別:
比如有字符串this is yansen’s blog,正則表達(dá)式為 /ya(msen|nsen|nsem)/ (不要在乎表達(dá)式怎么樣,這里只是為了說明引擎間的工作區(qū)別)。 NFA工作方式如下,先在字符串中查找 y 然后匹配其后是否為 a ,如果是 a 則繼續(xù),查找其后是否為 m 如果不是則匹配其后是否為 n (此時(shí)淘汰msen選擇支)。
然后繼續(xù)看其后是否依次為 s,e,接著測試是否為 n ,是 n 則匹配成功,不是則測試是否為 m 。為什么是 m ?因?yàn)?NFA 工作方式是以正則表達(dá)式為標(biāo)準(zhǔn),反復(fù)測試字符串,這樣同樣一個(gè)字符串有可能被反復(fù)測試了很多次!
而DFA則不是如此,DFA會(huì)從 this 中 t 開始依次查找 y,定位到 y ,已知其后為a,則查看表達(dá)式是否有 a ,此處正好有a 。然后字符串a(chǎn) 后為n ,DFA依次測試表達(dá)式,此時(shí) msen 不符合要求淘汰。nsen 和 nsem 符合要求,然后DFA依次檢查字符串,檢測到sen 中的 n 時(shí)只有nsen 分支符合,則匹配成功!
由此可以看出來,兩種引擎的工作方式完全不同,一個(gè)(NFA)以表達(dá)式為主導(dǎo),一個(gè)(DFA)以文本為主導(dǎo)!一般而論,DFA引擎則搜索更快一些!但是NFA以表達(dá)式為主導(dǎo),反而更容易操縱,因此一般程序員更偏愛NFA引擎! 兩種引擎各有所長,而真正的引用則取決與你的需要以及所使用的語言。
本正則表達(dá)式教程手冊涵蓋的內(nèi)容
本正則表達(dá)式教程涵蓋所有正則表達(dá)式基礎(chǔ)和高級知識,包含了正則表達(dá)式語法、正則表達(dá)式元字符、正則表達(dá)式運(yùn)算符優(yōu)先級、正則表達(dá)式匹配規(guī)則等等。
提示:本教程的每一章都包含了很多正則表達(dá)式實(shí)例,您可以直接點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕在線查看結(jié)果。這些例子將幫助您更好地學(xué)習(xí)理解正則表達(dá)式。
其它正則表達(dá)式相關(guān)學(xué)習(xí)參考資源
除了本頁面右側(cè)的知識拓展,還為大家精選了以下資源
最新章節(jié)
- 正則表達(dá)式 - 示例 2016-10-18
- 正則表達(dá)式 - 匹配規(guī)則 2016-10-18
- 正則表達(dá)式 - 運(yùn)算符優(yōu)先級 2016-10-18
- 正則表達(dá)式 - 元字符 2016-10-18
- 正則表達(dá)式 - 語法 2016-10-18
- 正則表達(dá)式 - 簡介 2016-10-18
- 正則表達(dá)式 - 教程 2016-10-18
相關(guān)課程
- 計(jì)算機(jī)網(wǎng)絡(luò)知識集合 2022-09-30
- 布爾教育HTTP協(xié)議視頻教程 2022-04-14
- 布爾教育正則表達(dá)式視頻教程 2022-04-18
- 布爾教育設(shè)計(jì)模式視頻教程 2022-04-21
- 計(jì)算機(jī)網(wǎng)絡(luò)概述—程序員必須掌握的基礎(chǔ)知識 2021-11-22
- 程序員入門必備教程—HTTP協(xié)議詳解 2021-11-19
- 一小時(shí)全面入門HTTP協(xié)議—web開發(fā)必備 2021-11-26
- 90分鐘搞定Web基礎(chǔ)(網(wǎng)絡(luò)協(xié)議|HTTP|Web服務(wù)器) 2021-12-10