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在這裡代...