今天群里讨论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)支持
未了,对于正则具体的编译和执行,待以后有空继续研究