正規表示式匹配原理

2022-02-20 11:52:54 字數 2043 閱讀 9909

正規表示式匹配原理:

本章節將會簡單的介紹一下正規表示式匹配原理,這將有助於書寫更為有效率的正規表示式,而不僅僅能夠完成匹配任務。

一.關於正規表示式引擎:

正則引擎大體上可分為不同的兩類:dfa和nfa。

1.dfa是deterministic finite automaton的縮寫,確定型有窮自動機。

2.nfa是non-deterministic finite automaton的縮寫,非確定型有窮自動機。nfa又可以分為兩類:

1): traditional nfa,傳統型非確定有窮自動。

2): posix nfa,符合標準的非確定型有窮自動機。

dfa引擎不需要進行回溯,所以匹配效率一般情況下要高,但是它並不支援捕獲組,於是也就不支援反向引用和$這種形式的引用。

posix nfa是指符合posix 標準的nfa引擎,它的主要特點是提供longest-leftmost匹配,也就是說在找到最左側最長匹配之前,它將繼續回溯,此種引擎對非貪婪模式不支援。

當前大多數語言都是使用傳統型nfa正則引擎,因為它更為強大靈活。

二.字串的組成:

想要真正理解正規表示式的匹配原理,那麼首先就要知道在正規表示式眼中,字串是由哪些成分構成的,圖示如下:

上面的得出,字串不但由字元組成,還包括字元之間的位置。對於字串"antzone"而言,它是由7個字元和8個位置構成。

三.零寬和占有字元表示式:

在正規表示式中,如果子表示式匹配到的是字元內容,而非位置,並且會被儲存到匹配結果中,那麼這個子表示式是占有字元的。如果子表示式匹配的是位置,或者匹配的內容不被儲存在最終結果中,那麼就認為這個子表示式是零寬的。

占有字元是互斥的,零寬度是非互斥的。也就是乙個字元,同一時間只能由乙個子表示式匹配,而乙個位置,卻可以同時由多個零寬度的子表示式匹配。

注意:這裡所說的子表示式並非只有用小括號括起來的表示式,而是正規表示式中的任意匹配單元。

四.控制權的傳動:

正規表示式當開始匹配的時候,一般是由乙個子表示式獲取控制權,從字串中的某乙個位置開始嘗試匹配,乙個子表示式開始嘗試匹配的位置,是從前一子表達匹配成功的結束位置開始的,看下面的例子:

(子表示式一)(子表示式二)

如果子表示式一是零寬度的,那麼它的匹配起始位置和結束位置是同乙個位置,如果位置是0,那麼子表示式二將從位置0進行匹配。

如果子表示式一是占有字元的,開始匹配位置0,結束匹配位置是4,那麼子表示式二的開始匹配位置就是4。

五.正規表示式匹配分解:

分解演示一:

1.將要進行匹配的字串:"antzone"。

2.正規表示式:/zone/。

匹配過程如下:

首先由正規表示式中字元"z"取得控制權,然後去嘗試匹配字串中的第乙個字元"a",匹配失敗,則繼續嘗試第二個字元"n"依然會失敗,直到字元"z",匹配成功,這樣控制權由正規表示式中的字元"z"傳遞給字元"o",由於字元"z"已經被匹配,所以字元"o"將會從位置4開始匹配,由"o"來匹配"o",匹配成功,這樣依次傳遞下去,最終正規表示式匹配成功,匹配結果為"zone"。

例項如下:

var str="antzone";

var reg=/zone/;

console.log(str.match(reg));

分解演示二:

1.將要進行匹配的字串:"antzone"。

2.正規表示式:/\ban?t/。

匹配過程如下:

首先由正規表示式中的元字元\b取得控制權,開始去嘗試匹配字串"antzone",它匹配的是單詞邊界位置,匹配成功後,控制權交給正規表示式字元"a",由於"\b"是零寬的,所以"a"從位置0開始匹配,匹配字元"a"成功,然後將控制權交給"n?",由於「?」是匹配優先量詞(同時記錄乙個備選狀態,如果匹配不成功則進行回溯),所以會先嘗試進行匹配,能夠成功"n",控制權然後交給字元"t",也能夠匹配成功,匹配結果為:"ant"。

例項如下:

var str="antzone";

var reg=/\ban?t/;

console.log(str.match(reg));

正規表示式 匹配

字串 void abtr quint32 ab 表示乙個正規表示式 template class bidirectionaliterator class allocator std allocator sub match bidirectionaliterator class match resul...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解法 首先要想到用遞迴處理...

正規表示式匹配

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 class solutio...