prog.h 和 prog.cc定義了幾種基本的資料結構:
bitmap(用bit位來標記某個元素的值),主要用於bytemap字元到字元集合的計算,劃分字元區間:[00-ff],[61-61],[62-62],[63-63]
instop(幾種基本的指令操作碼,與inst對應),
emptyop(^,$,\a,\z,\b,\b),
inst表示指令,所有的正規表示式都可以由這幾種指令所構成 (類似nfa的幾種基本結構,複雜的大型結構由多種基本結構復合構成)inst定義了若干函式構建對應的基本結構
anchor,
matchkind, 匹配時的貪婪與否
prog compile之後的型別,類似於nfa,
compile.cc檔案
frag 結構,多個inst復合的一種結構,包括開始inst和結束inst,與patchlist的函式一起使用對多個inst結合為乙個大的frag
encoding 編碼方式,專案中使用的應該是kencodinglatin1編碼方式
compiler
後序遍歷構建的regexp結構(如ab*c|d -> ab*.c.d|),每讀取乙個元素,建立對應的基本inst結構,當遇到符號要進行歸併時,建立對應的inst結構並將其中的out,out1等替換為對應的frag結構,即多個小的frag組合為乙個大的frag。完成後,最終應該為乙個大的frag結構
compiler中使用遍歷語法樹regexp的walker來逐步遍歷語法樹,轉換為prog形式。
使用walker遍歷語法樹regexp,每個節點的型別為frag(結構)。掃瞄節點對應的所有子樹,並根據其操作符與父節點結合成為新的節點,取代原來的節點樹,一直持續直到語法樹中只剩下乙個節點frag。這個過程是在compiler中進行的,compiler根據遍歷的狀態,動態的為掃瞄到的每乙個狀態分配空間,記錄狀態數。當完成整個掃瞄過程後,將最終的狀態數等資訊存入prog中,銷毀compiler。完成語法樹regexp到prog的轉換。compiler只在過程中使用,完成轉換後就銷毀
prog轉換為nfa進行匹配,匹配時,q0_,q1_分別作為當前的狀態集合和下乙個狀態集合,對runq狀態集合,匹配字元並轉移到狀態集合nextq。step函式來完成匹配並轉移狀態集合的功能(狀態集合中的所有狀態runq,分別接受字元c,p指標向前移動一位,並將新狀態和新狀態通過空邊可以到達的狀態加入到狀態集nextq中。addtothreadq函式,inst的id,及後通過空邊可以到達的狀態加入到狀態集threadq中)。然後銷毀runq,置換runq和nextq,重新開始匹配過程。
re正規表示式2
1.字元 匹配 前面的字元0次或者多次。注意 是匹配 前乙個字元,只能是 前乙個字元多次列印出來。前面其他的字元相當於字首會列印出來,但是不會再匹配。前乙個字元前面的其他字元裡的首字元先遇到會直接停下來,不去尋找其他的字元。print re.search rt rrtbbbbrbrbreyrtrr ...
正規表示式 RE
最近一段時間在研究nginx的rewirte重寫機制,因此對re需要有一定的了解,看了想關的文章,因此自己來寫一篇類似總結性的的文章。基本來說,正規表示式是一種用來描述一定數量文字的模式。regex regular express。本文用 regex 來表示一段具體的正規表示式。一段文字就是最基本的...
re正規表示式
1.數字 0 9 2.n位的數字 d 3.至少n位的數字 d 4.m n位的數字 d 5.零和非零開頭的數字 0 1 9 0 9 6.非零開頭的最多帶兩位小數的數字 1 9 0 9 0 9 7.帶1 2位小數的正數或負數 d d 8.正數 負數 和小數 d d 9.有兩位小數的正實數 0 9 0 9...