grep正則執行模式粗探

今天羣裏討論grep正則時,用到了-P選項

查了下man

      -P, --perl-regexp
              Interpret PATTERN as a Perl regular expression.

 

 

然後對grep的正則執行模式起了點興趣,繼續查看了grep的正則執行過程

還是從main函數開始,跟蹤grep的函數調用過程

1:函數調用路徑

       在grep.c的main函數裏,開始時,對參數(相當多)進行了分析(略)

       然後調用正則編譯函數

然後分別對每個文件,調用了grepfile函數,因此grep支持對多個文件進行操作(包括標準輸入)

grepfile對文件類型進行分析,然後調用grep函數

grep函數循環讀取(調用fillbuf)文件匹配(調用grepbuf)

grepbuf裏,有個match_offset指針,用於指針從左到右的偏移匹配

可以看出grepbuf調用了execute函數指針

execute即是執行正則的函數

 

2:正則模式設定

execute函數採用指針的形式,是因爲grep彩用了多種正則執行模式,用指針方便調用不同模式的正則匹配函數

execute函數指針在install_matcher函數裏賦值

這裏install_matcher就是在main裏分析不同參數是調用的,以指定採用哪種正則“matcher匹配器”?。

通過不同參數指定,並通過setmatcher函數指定matcher值

默認的matcher值是grep:

 

 

 

 

3:正則函數

       正則在處理步驟上,大致可分成編譯和執行二個步驟:編譯正則表達式,執行正則表達式

       上邊提到的函數指針

在install_matcher裏,設定了正則compile(編輯器?)與正則execute(執行器)

 

matchers數組,結構數組在search.c文件裏指定

默認爲Gcompile和EGexecute

 

相關函數定義:

 

 

這邊就是調用不同正則表達式編譯和解析函數了

以grep默認的Gcompilte和EGexecute爲例

Gcompilte事實上調用了dfa.c、dfa.h文件裏的正則編譯函數dfacomp

 

而EGexecute則是調用了正則查詢函數re_match,re_search

這二個函數在標準庫定義/usr/include/regex.h

 

 

而對於perl正則模式Pcompile,Pexecute則是調用了perl正則處理函數

這二個函數需要perl正則庫(pcre.h)支持

 

 

未了,對於正則具體的編譯和執行,待以後有空繼續研究

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章