亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

正則表達(dá)式手冊(cè)

閱讀(28426) 更新時(shí)間(2022-04-13)

正則表達(dá)式,又稱(chēng)規(guī)則表達(dá)式。(英語(yǔ):Regular Expression,在代碼中常簡(jiǎn)寫(xiě)為regex、regexp或RE),計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。


正則表達(dá)式是對(duì)字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個(gè)“規(guī)則字符串”,這個(gè)“規(guī)則字符串”用來(lái)表達(dá)對(duì)字符串的一種過(guò)濾邏輯。

許多程序設(shè)計(jì)語(yǔ)言都支持利用正則表達(dá)式進(jìn)行字符串操作。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正則表達(dá)式引擎。正則表達(dá)式這個(gè)概念最初是由Unix中的工具軟件(例如sed和grep)普及開(kāi)的。正則表達(dá)式通??s寫(xiě)成“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í)從初級(jí)到高級(jí)的正則表達(dá)式知識(shí)。如果你有任何疑問(wèn),請(qǐng)前往PHP中文網(wǎng)正則表達(dá)式社區(qū)提出你的問(wèn)題,會(huì)有熱心網(wǎng)友為你解答。

正則表達(dá)式特點(diǎn)

  • 靈活性、邏輯性和功能性非常強(qiáng);

  • 可以迅速地用極簡(jiǎn)單的方式達(dá)到字符串的復(fù)雜控制。

  • 對(duì)于剛接觸的人來(lái)說(shuō),比較晦澀難懂。

由于正則表達(dá)式主要應(yīng)用對(duì)象是文本,因此它在各種文本編輯器場(chǎng)合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達(dá)式來(lái)處理文本內(nèi)容。

目的

給定一個(gè)正則表達(dá)式和另一個(gè)字符串,我們可以達(dá)到如下的目的:

  • ?給定的字符串是否符合正則表達(dá)式的過(guò)濾邏輯(稱(chēng)作“匹配”)

  • 可以通過(guò)正則表達(dá)式,從字符串中獲取我們想要的特定部分。

正則引擎

正則引擎主要可以分為兩大類(lèi):

  • 一種是DFA,

  • 一種是NFA。

這兩種引擎都有了很久的歷史(至今二十多年),當(dāng)中也由這兩種引擎產(chǎn)生了很多變體!于是POSIX的出臺(tái)規(guī)避了不必要變體的繼續(xù)產(chǎn)生。這樣一來(lái),主流的正則引擎又分為3類(lèi):一、DFA,二、傳統(tǒng)型NFA,三、POSIX NFA。

DFA 引擎在線性時(shí)狀態(tài)下執(zhí)行,因?yàn)樗鼈儾灰蠡厮荩ú⒁虼怂鼈冇肋h(yuǎn)不測(cè)試相同的字符兩次)。DFA 引擎還可以確保匹配最長(zhǎng)的可能的字符串。但是,因?yàn)?DFA 引擎只包含有限的狀態(tài),所以它不能匹配具有反向引用的模式;并且因?yàn)樗粯?gòu)造顯示擴(kuò)展,所以它不可以捕獲子表達(dá)式。

傳統(tǒng)的 NFA 引擎運(yùn)行所謂的“貪婪的”匹配回溯算法,以指定順序測(cè)試正則表達(dá)式的所有可能的擴(kuò)展并接受第一個(gè)匹配項(xiàng)。因?yàn)閭鹘y(tǒng)的 NFA 構(gòu)造正則表達(dá)式的特定擴(kuò)展以獲得成功的匹配,所以它可以捕獲子表達(dá)式匹配和匹配的反向引用。但是,因?yàn)閭鹘y(tǒng)的 NFA 回溯,所以它可以訪問(wèn)完全相同的狀態(tài)多次(如果通過(guò)不同的路徑到達(dá)該狀態(tài))。因此,在最壞情況下,它的執(zhí)行速度可能非常慢。因?yàn)閭鹘y(tǒng)的 NFA 接受它找到的第一個(gè)匹配,所以它還可能會(huì)導(dǎo)致其他(可能更長(zhǎng))匹配未被發(fā)現(xiàn)。

POSIX NFA 引擎與傳統(tǒng)的 NFA 引擎類(lèi)似,不同的一點(diǎn)在于:在它們可以確保已找到了可能的最長(zhǎng)的匹配之前,它們將繼續(xù)回溯。因此,POSIX NFA 引擎的速度慢于傳統(tǒng)的 NFA 引擎;并且在使用 POSIX NFA 時(shí),您恐怕不會(huì)愿意在更改回溯搜索的順序的情況下來(lái)支持較短的匹配搜索,而非較長(zhǎng)的匹配搜索。

使用DFA引擎的程序主要有:

awk,egrep,flex,lex,MySQL,Procmail等;

使用傳統(tǒng)型NFA引擎的程序主要有:

GNU Emacs,Java,ergp,less,more,.NET語(yǔ)言,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。

舉例簡(jiǎn)單說(shuō)明NFA與DFA工作的區(qū)別:

比如有字符串this is yansen’s blog,正則表達(dá)式為 /ya(msen|nsen|nsem)/ (不要在乎表達(dá)式怎么樣,這里只是為了說(shuō)明引擎間的工作區(qū)別)。 NFA工作方式如下,先在字符串中查找 y 然后匹配其后是否為 a ,如果是 a 則繼續(xù),查找其后是否為 m 如果不是則匹配其后是否為 n (此時(shí)淘汰msen選擇支)。

然后繼續(xù)看其后是否依次為 s,e,接著測(cè)試是否為 n ,是 n 則匹配成功,不是則測(cè)試是否為 m 。為什么是 m ?因?yàn)?NFA 工作方式是以正則表達(dá)式為標(biāo)準(zhǔn),反復(fù)測(cè)試字符串,這樣同樣一個(gè)字符串有可能被反復(fù)測(cè)試了很多次!

而DFA則不是如此,DFA會(huì)從 this 中 t 開(kāi)始依次查找 y,定位到 y ,已知其后為a,則查看表達(dá)式是否有 a ,此處正好有a 。然后字符串a(chǎn) 后為n ,DFA依次測(cè)試表達(dá)式,此時(shí) msen 不符合要求淘汰。nsen 和 nsem 符合要求,然后DFA依次檢查字符串,檢測(cè)到sen 中的 n 時(shí)只有nsen 分支符合,則匹配成功!

由此可以看出來(lái),兩種引擎的工作方式完全不同,一個(gè)(NFA)以表達(dá)式為主導(dǎo),一個(gè)(DFA)以文本為主導(dǎo)!一般而論,DFA引擎則搜索更快一些!但是NFA以表達(dá)式為主導(dǎo),反而更容易操縱,因此一般程序員更偏愛(ài)NFA引擎! 兩種引擎各有所長(zhǎng),而真正的引用則取決與你的需要以及所使用的語(yǔ)言。

本正則表達(dá)式教程手冊(cè)涵蓋的內(nèi)容

本正則表達(dá)式教程涵蓋所有正則表達(dá)式基礎(chǔ)和高級(jí)知識(shí),包含了正則表達(dá)式語(yǔ)法、正則表達(dá)式元字符、正則表達(dá)式運(yùn)算符優(yōu)先級(jí)、正則表達(dá)式匹配規(guī)則等等。

提示:本教程的每一章都包含了很多正則表達(dá)式實(shí)例,您可以直接點(diǎn)擊?"運(yùn)行實(shí)例"?按鈕在線查看結(jié)果。這些例子將幫助您更好地學(xué)習(xí)理解正則表達(dá)式。

其它正則表達(dá)式相關(guān)學(xué)習(xí)參考資源

除了本頁(yè)面右側(cè)的知識(shí)拓展,還為大家精選了以下資源