亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

正則中的回溯定義與用法分析【JS與java實現(xiàn)】

 更新時間:2016年12月27日 11:57:41   作者:路人戊戌乙亥  
這篇文章主要介紹了正則中的回溯定義與用法,結合實例形式分析了回溯的概念、功能并提供了JS與java實現(xiàn)方法,需要的朋友可以參考下

本文實例分析了正則中的回溯定義與用法。分享給大家供大家參考,具體如下:

關于“回溯”我也是第一次接觸,對它也不算很了解。下面就把我所了解的做為一個心德記錄下來,以備查看。

我們所使用的正則表達式的匹配基礎大概分為:優(yōu)先選擇最左端(最靠開頭)的匹配結果和標準的匹配量詞(*、+、?和{m, n})是匹配優(yōu)先的。

“優(yōu)先選擇最左端的匹配”顧名思義就是從字符串的起始位置開始匹配直到匹配結束這是基礎;“標準匹配量詞”又分為“非確定型有窮自動機(NFA)”也可以叫做“表達式主導”;另外一種是“確定型有窮自動機(DFA)”也可以叫做“文本主導”。我們目前在JavaScript中所使用的正則表達式為“表達式主導”。表達式主導和文本主導解釋起來有些麻煩,先看來一個例子可能會清楚些。

// 使用正則表達式匹配文本
var reg = /to(nite|knight|night)/;
var str = 'doing tonight';
reg.test(str);

在上面的這個例子中,第一個元素[t],它將會重復嘗試,直到目標字符串中找到‘t'為止。之后,就檢查緊隨其后的字符是否能由[o]匹配,如果能,就檢查下面的元素(nite|knight|night)。它的真正含義是“nite”或者“knight”或者“night”。引擎會依次嘗試這3種可能。嘗試[nite]的過程是先嘗試[n],然后[i],然后[t],最后是[e]。如果這種嘗試失敗,引擎會嘗試另一種可能,如此繼續(xù)下去,直到匹配成功或是報告失敗。表達式中的控制權在不同的元素之間轉換,所以稱為“表達式主導”。

同樣是上面的例子“文本主導”在掃描字符串時,會記錄當前有效的所有匹配可。當引擎移動到t時,它會在當前處理的匹配可能中添加一個潛在的可能:

字符串中的位置 正則表達中的位置
……doing tonight 可能的匹配位置:/to(nite|knight|nigth)/

接下來掃描的每個字符,都會更新當前的可能匹配序列。繼續(xù)掃描兩個字符以后的情況是:

字符串中的位置 正則表達中的位置
……doing tonight 可能的匹配位置:/to(nite|knight|nigth)/

有效的可能匹配變?yōu)閮蓚€(knight被淘汰出局)。掃描到g時,就只剩下一個可能匹配了。當h和t匹配完成后,引擎發(fā)現(xiàn)匹配已經(jīng)完成,報告成功?!拔谋局鲗А笔且驗樗鼟呙璧淖址械拿總€字符都對引擎進行了控制。

如果想要弄明白“表達式主導”是如何工作的,那就要看一下我們今天的主題“回溯(backtracking)”?;厮菥拖袷窃谧卟砺房冢斢龅讲砺返臅r候就先在每個路口做一個標記。如果走了死路,就可以照原路返回,直到遇見之前所做過的標記,標記著還未嘗試過的道路。如果那條路也走不能,可以繼續(xù)返回,找到下一個標記,如此重復,直到找到出路,或者直到完成所有沒有嘗試過的路。

在許多情況下,正則引擎必須在兩個(或更多)選項中做出選擇。當遇到/……x?……/時,引擎必須是否嘗試匹配X。對于/……X+……/的情況,毫無疑問,X至少嘗試匹配一次——因為加號要求必須匹配至少一次。第一個X匹配之后,此要求已經(jīng)滿足,需要決定是否嘗試下一個X。如果決定進行,還要決定是否匹配第三個X,第四個X,如此繼續(xù)。每次選擇,其實就是做一個標記,用于提示此處還有另一個可能的選擇,保留起來以備用。在回溯的過程中要考慮兩個要點:哪個分支應當首先選擇?回溯的時候使用的是哪個(或者是哪些個)之前保存的分支?

第一個問題是按下面這條重要原則來選擇的:

如果需要在“進行嘗試”和“路過嘗試”之間選擇,對于匹配優(yōu)先量詞,引擎會優(yōu)先選擇“進行嘗試”,而對于忽略優(yōu)先量詞,會選擇“路過嘗試”。

第二個問題是按以下這條原則:

距離當前最近儲存的選項就是當本地失敗強制回溯時返回的。使用的原則是LIFO(last in first out,后進先出)。

我們先來看幾個在道路中做標記的例子:

1、未進行回溯的匹配

用[ab?c]來匹配“abc”。[a]匹配之后,匹配的當前狀態(tài)如下:

“abc” ab?c

現(xiàn)在輪到[b?]了,正則引擎需要決定:是需要嘗試[b]呢,還是跳過?因為[?]是匹配優(yōu)先的,它會嘗試匹配。但是,為了確保在這個嘗試最終失敗之后能夠恢復,引擎會把:

“abc” ab?c

添加到備用狀態(tài)序列中。也就是說,稍后引擎可能從下面的位置繼續(xù)匹配:從正則表達式中的[b?]之后,字符串的c之前(也就是說當前的位置)匹配。這實際上就是跳過[b]的匹配,而問題容許這樣做。引擎做好標記后,就會繼續(xù)向前檢查[b]。在示例中,它能夠匹配,所以新的當前狀態(tài)變?yōu)椋?br />
“abc” ab?c

最終的[c]也能成功匹配,所以整個匹配完成。備用狀態(tài)不再需要了,所以不再保存它們。

2、進行了回溯的匹配

下面要匹配的文本是“ac”,在嘗試[b]之前,一切都與之前的過程相同。顯然,這次[b]無法匹配。也就是說,對[……?]進行嘗試的路走不通了。因為有一個備用狀態(tài),這個“局部匹配失敗”產(chǎn)工會導致整體匹配失敗。引擎會進行回溯,也就是說,把“當前狀態(tài)”切換為最近保存的狀態(tài)。

“ac” ab?c

在[b]嘗試之前保存的尚未嘗試的選項。這時候,[c]可以匹配c,所以整個匹配宣告完成。

3、不成功的匹配

現(xiàn)在要匹配的文本是“abx”。在嘗試[b]以前,因為存在問號,保存了這個備用狀態(tài):

“abx” ab?c

[b]能夠匹配,但這條路往下卻走不通了,因為[c]無法匹配x。于是引擎會回溯到之前的狀態(tài),“交還”b給[c]來匹配。顯然,這次測試也失敗了。如果還有其他保存的狀態(tài),回溯會繼續(xù)進行,但是此時不存在其他狀態(tài),在字符串中當前位置開始的整個匹配也就宣告失敗。

例子1: 提取字符串   提取 da12bka3434bdca4343bdca234bm   提取包含在字符a和b之間的數(shù)字,但是這個a之前的字符不能是c,b后面的字符必須是d才能提取。

例如這里就只有3434這個數(shù)字滿足要求。那么我們怎么提取呢?

首先我們寫出提取這個字符串的表達式: (?<!c)a(/d+)bd  這里就只有一個捕獲組(/d+)

Java代碼片段如下:

Pattern p = Pattern.compile( "(?<!c)a(//d+)bd " );
Matcher m = p.matcher( "da12bka3434bdca4343bdca234bm" );
 while (m.find()){
 System.out.println(m.group( 1 )); //我們只要捕獲組1的數(shù)字即可。結果 3434
 System.out.println(m.group(0)); // 0組是整個表達式,看這里,并沒有提煉出(?<!c)的字符 。結果 a3434bd
}

例子2: 將一些多位的小數(shù)截短到三位小數(shù):\d+\.\d\d[1-9]?\d+

在這種條件下 6.625 能進行匹配,這樣做沒有必要,因為它本身就是三位小數(shù)。最后一個“5”本來是給 [1-9] 匹配的,但是后面還有一個 \d+ 所以,[1-9] 由于是“?”可以不匹配所以只能放棄當前的匹配,將這個“5”送給 \d+ 去匹配,如果改為:

\d+\.\d\d[1-9]?+\d+

的侵占形式,在“5”匹配到 [1-9] 時,由于是侵占式的,所以不會進行回溯,后面的 \d+ 就匹配不到任東西了,所以導致 6.625 匹配失敗。

這種情況,在替換時就有效了,比如把數(shù)字截短到小數(shù)點后三位,如果正好是三位小數(shù)的,就可以不用替換了,可以提高效率,侵占量詞基本上就是用來提高匹配效率的。

把 \d+\.\d\d[1-9]?+\d+ 改為 \d+\.\d\d(?>[1-9]?)\d+ 這樣是一樣的。

PS:這里再為大家提供2款非常方便的正則表達式工具供大家參考使用:

JavaScript正則表達式在線測試工具:
http://tools.jb51.net/regex/javascript

正則表達式在線生成工具:
http://tools.jb51.net/regex/create_reg

更多關于JavaScript相關內(nèi)容感興趣的讀者可查看本站專題:《JavaScript正則表達式技巧大全》、《JavaScript替換操作技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》、《JavaScript中json操作技巧總結》、《JavaScript錯誤與調試技巧總結》及《JavaScript數(shù)學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

相關文章

最新評論