国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

正則表達式手冊

閱讀(28377) 更新時間(2022-04-13)

正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學(xué)的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。


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

許多程序設(shè)計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內(nèi)建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通常縮寫成“regex”,單數(shù)有regexp、regex,復(fù)數(shù)有regexps、regexes、regexen。

第一個正則表達式實例!

實例

<!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>

運行實例 ?

點擊 "運行實例" 按鈕查看在線實例

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

正則表達式特點

  • 靈活性、邏輯性和功能性非常強;

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

  • 對于剛接觸的人來說,比較晦澀難懂。

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

目的

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

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

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

正則引擎

正則引擎主要可以分為兩大類:

  • 一種是DFA,

  • 一種是NFA。

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

DFA 引擎在線性時狀態(tài)下執(zhí)行,因為它們不要求回溯(并因此它們永遠(yuǎn)不測試相同的字符兩次)。DFA 引擎還可以確保匹配最長的可能的字符串。但是,因為 DFA 引擎只包含有限的狀態(tài),所以它不能匹配具有反向引用的模式;并且因為它不構(gòu)造顯示擴展,所以它不可以捕獲子表達式。

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

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

使用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(使用時可以明確指定);

也有使用DFA/NFA混合的引擎:

GNU awk,GNU grep/egrep,Tcl。

舉例簡單說明NFA與DFA工作的區(qū)別:

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

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

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

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

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

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

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

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

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