正規表示式學習筆記(二)表示式的匹配原理

2022-08-13 06:21:12 字數 2282 閱讀 7134

1.dfa(符合或者不符合posix標準的都屬於此類):電動機

2.傳統nfa: 傳統的汽油機

3.posix nfa:符合新標準的汽油機

匹配先從需要查詢的字串的起始位置嘗試匹配,即從第乙個字元開始測試整個正規表示式,如果測試了所有

可能後仍然找不到結果,則從第二個字元開始測試,直到找到結果。

例如:1.用'ora'來匹配floaral,從字串左邊開始的第一輪匹配會失敗(因為ora不能匹配flo),同理

第二輪也會失敗,第三輪成功。

2.用'cat'來匹配:

the dragging belly indicates that your cat is too fat.

匹配結果是indicates中的cat

3.用'fat|cat|belly|your'匹配2中的句子,結果是?

注意:錨點直接匹配位置。

標準匹配量詞:?,*,+,

如果用這些量詞來約束某個表示式,例如'(tang)*'中的'tang', 'a?'中的'a',在匹配成功之前,進行嘗試的次數是存在上限和下限的

規則2表明這些嘗試總是希望獲得最長的匹配。它們總是嘗試匹配盡可能多的字串,直到匹配上限為止。

例如:用'[0-9]+'匹配'tangjia19900326'能匹配字串中的所有數字,這是因為1匹配成功之後,已經滿足了匹配

成功的下限了,但此時正規表示式是匹配優先的,所以它會繼續匹配完所有的數字。

過度的匹配優先:

'^.*([0-9](0-9))'匹配過程:由於標準量詞優先原則,'.*'會直接匹配完整行,此時'([0-9][0-9])在嘗試匹配時會失敗,這樣它就會強迫'.*'交出

一些字元供自己匹配,但這種『強迫』是建立在不破壞'.*'匹配成功的條件之上的。

例如,用上述表示式匹配'about a 25 girl chen','.*'匹配整個字元穿後,第乙個'[0-9]'的匹配要求'.*'釋放乙個字元'n',但這並不能讓'[0-9]'

匹配,所以必須繼續交還字元'e',直到釋放'5'。但不幸的是第乙個'[0-9]'雖然匹配成功了,第二個'[0-9]'仍然不能匹配。為了匹配整個

正規表示式,此時必須釋放'2'(給第乙個匹配),第二個'[0-9]'開始匹配,並最後成功匹配到'5'。

思考:用'^.*([0-9]+)'來匹配'tang 2003'   括號會捕獲到什麼?

例如:用表示式'to(nite|knight|night)'匹配'...tonight...',表示式第乙個元素是't',它將會重複嘗試,

直到在目標字串中找到't',找到後再在目標字串中查詢'o',找到後會在目標元素中依次嘗試'nite','knight',

'night'三種可能匹配成功。嘗試'nite'的過程和之前一樣,乙個字元乙個字元地依次嘗試。

基本原理----略。兩個重要原則:

1.對於匹配優先量詞,會進行嘗試,

對於忽略優先量詞,會跳過嘗試

2.後進先出

用'.*?'來匹配:

billionsandzillionsof suns......

開始匹配''之後,'.*?'首先決定不匹配任何字元,因為他是忽略優先的。

於是控制權交給後面的'

交還給'.*?',表示式便匹配到了b,因為是忽略優先的,控制權再次交給'

在重複數次後,最終匹配到: 『billions』

但如果我們用該表示式匹配: 『billionsandzillionsof suns......』

就會匹配到:『billionsandzillions

我們可以用否定環視解決這個問題:

使用'(?>......)'的匹配與正常匹配的差別在於,如果匹配進行到結構結束後(也就是閉括號之後),結構體中的所有備用狀態都將會被拋棄。

例子: '(\.\d\d(?>[1-9]?))\d+'在固化分組內,量詞能夠正常工作,如果'[1-9]'不能匹配,正規表示式則會返回'?'留下的備用狀態。

然後脫離固化分組,繼續前進到'\d+'。在這種狀態下,當控制權離開固化分組時,沒有備用狀態需要放棄。

占有優先量詞和匹配優先量詞的差別:不交還已經匹配的字元。

略1.對於大多數傳統型nfa:按順序匹配,前面的匹配成功就不嘗試後面的。

nfa:按順序來

dfa:匹配最長的

正規表示式學習筆記 二 簡單的正規表示式

一 簡單的正規表示式 注意 在使用正規表示式的時候,會發現幾乎所有的問題都有不止一種解決方法。有的比較簡單,有的比較快速,有的相容性很好,有的功能更全,同乙個問題往往會有多種解決方案。二 匹配單個字元 1 匹配純文字 直接輸入文字,就可以匹配。如 i am a boy.輸入正規表示式 am 2 多個...

正規表示式 表示式

網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...

正規表示式(二) 正規表示式的切割

切割 還記得stirng的split的方法嗎.可以按照 空格,豎線 對字串進行切割.正規表示式的切割 是指,我們按照正規表示式的規則對字串來進行一些複雜的切割 比方說現在我想按照多個空格來進行切割 string str zhangsan lisei wangwu string reg s s在這裡代...