不到1000行的正規表示式原始碼分析04
今天購買了乙個usb變多個usb的玩意兒,感覺很神奇,乙個usb口可以當多個口用,如果同時連線滑鼠、鍵盤,系統是如何處理的呦,難道象令牌環網,傳遞乙個令牌?太神奇。
感覺今天基本能把**串起來了。
在grep.c中,執行時
echo "foooo" | ./ogrep 'fo*'
先執行re_comp,把'fo*'變為
chr f
clo chr o
再執行re_exec進行字串匹配。
在re_exec中,分三種情況:
1)如果是bol
調pmatch進行匹配
2)如果是chr
先從源串中找到乙個與nfa相等的字串,再進行第3)
3)從源串第乙個字開始匹配,如果匹配不上,就從下個字元開始,一直到結束。
pmatch呢,開始看得太細,現在從巨集觀上一看,其邏輯也很好理解。就是把nfa編譯的結果逐字與源串比較,如果不等就報錯,如果相等就繼續。
可能按程式的執行過程來理解,是比較好的。光看程式,不知它在執行中的地位,這樣看,很容易迷失方向。
而按程式執行的思路來理解,就好了。今天先到這裡。明天再繼續吧。
巨集觀上理解了,就完成了一大半,明天就把它串起來,把沒理解的細節理解。再多加printf語句,進行除錯吧。
另外,這個匹配是nfa的,而ruby0.49中的,好象是dfa的。nfa是正規表示式主導,而dfa是文字主導,明天再細看吧。
不到1000行的正規表示式原始碼分析03
如果說,re comp沒有用到遞迴,基本還能理解。但re exec就有些不理解了。因為其中用到了遞迴。pmatch也是遞迴函式,看來,要想學計算機有所成就,必須把遞迴搞懂。也許正是在這種角度上講,電腦程式的構造和解釋 這本書才有其成為經典的價值。這篇文章就是湊數了。我總覺得,要多產,然後求精品。萬萬...
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 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...