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

正規(guī)表示式手冊(cè)

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

正規(guī)表示式,又稱規(guī)則表達(dá)式。 (英文:Regular Expression,在程式碼中常簡寫為regex、regexp或RE),電腦科學(xué)的一個(gè)概念。正規(guī)表通常被用來檢索、取代那些符合某個(gè)模式(規(guī)則)的文字。


正規(guī)表示式是對(duì)字串運(yùn)算的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個(gè)“規(guī)則字串”,這個(gè)“規(guī)則字串”用來表達(dá)對(duì)字串的一種過濾邏輯。

許多程式設(shè)計(jì)語言都支援利用正規(guī)表示式進(jìn)行字串運(yùn)算。例如,在Perl中就內(nèi)建了一個(gè)功能強(qiáng)大的正規(guī)表示式引擎。正規(guī)表示式這個(gè)概念最初是由Unix中的工具軟體(例如sed和grep)普及開的。正規(guī)表示式通??s寫成“regex”,單數(shù)有regexp、regex,複數(shù)有regexps、regexes、regexen。

第一個(gè)正規(guī)表示式實(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>

執(zhí)行實(shí)例 ?

點(diǎn)擊 "執(zhí)行實(shí)例" 按鈕查看線上實(shí)例

提示:我們的正規(guī)表示式教學(xué)將幫助您學(xué)習(xí)從初級(jí)到高級(jí)的正規(guī)表示式知識(shí)。如果你有任何疑問,請(qǐng)前往PHP中文網(wǎng)正規(guī)表示式社群提出你的問題,會(huì)有熱心網(wǎng)友為你解答。

正規(guī)表示式特點(diǎn)

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

  • 可以快速地用極簡單的方式達(dá)到字串的複雜控制。

  • 對(duì)於剛接觸的人來說,比較晦澀難懂。

由於正規(guī)表示式主要應(yīng)用物件是文本,因此它在各種文字編輯器場(chǎng)合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正規(guī)表示式來處理文字內(nèi)容。

目的

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

  • ?給定的字串是否符合正規(guī)表示式的過濾邏輯(稱為「匹配」)

  • 可以透過正規(guī)表示式,從字串中取得我們想要的特定部分。

正規(guī)引擎

正規(guī)引擎主要可以分為兩大類:

  • ##一種是DFA,

  • 一種是NFA。

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

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

傳統(tǒng)的 NFA 引擎運(yùn)行所謂的「貪婪」的匹配回溯演算法,以指定順序測(cè)試正規(guī)表示式的所有可能的擴(kuò)展並接受第一個(gè)匹配項(xiàng)。因?yàn)閭鹘y(tǒng)的 NFA 構(gòu)造正規(guī)表示式的特定擴(kuò)展以獲得成功的匹配,所以它可以捕捉子表達(dá)式匹配和匹配的反向引用。但是,因?yàn)閭鹘y(tǒng)的 NFA 回溯,所以它可以訪問完全相同的狀態(tài)多次(如果通過不同的路徑到達(dá)該狀態(tài))。因此,在最壞情況下,它的執(zhí)行速度可能會(huì)非常慢。因?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ì)願(yuàn)意在更改回溯搜索的順序的情況下來支持較短的匹配搜索,而非較長的匹配搜索。

使用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工作的差異:

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

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

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

由此可以看出來,兩種引擎的工作方式完全不同,一個(gè)(NFA)以表達(dá)式為主導(dǎo),一個(gè)(DFA)以文本為主導(dǎo)!一般而論,DFA引擎則搜尋更快一些!但NFA以表達(dá)式為主導(dǎo),反而更容易操縱,因此一般程式設(shè)計(jì)師更偏好NFA引擎!兩種引擎各有所長,而真正的引用則取決與你的需要以及所使用的語言。

本正規(guī)表示式教學(xué)手冊(cè)涵蓋的內(nèi)容

本正規(guī)表示式教學(xué)涵蓋所有正規(guī)表示式基礎(chǔ)和進(jìn)階知識(shí),包含了正規(guī)表示式語法、正規(guī)表示式元字元、正規(guī)則表達(dá)式運(yùn)算子優(yōu)先權(quán)、正規(guī)表示式符合規(guī)則等等。

提示:本教學(xué)的每一章都包含了許多正規(guī)表示式實(shí)例,您可以直接點(diǎn)擊?"執(zhí)行實(shí)例"?按鈕線上查看結(jié)果。這些範(fàn)例將幫助您更好地學(xué)習(xí)理解正規(guī)表示式。

其它正規(guī)表示式相關(guān)學(xué)習(xí)參考資源

除了本頁右邊的知識(shí)拓展,也為大家精選了以下資源

#