grep正则执行模式粗探

来源:互联网 发布:mac 移动桌面图标 编辑:程序博客网 时间:2024/05/10 11:44

今天群里讨论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)支持

 

 

未了,对于正则具体的编译和执行,待以后有空继续研究

 

 

 

 

 

原创粉丝点击