影响使用正则表达式的因素:
C语言中使用strstr或strcmp函数(需要确定字符串中含有此子串)进行字符串匹配,匹配效率较低,且两个函数均为绝对匹配,灵活性较差。
正则表达式通过数据的规则,匹配提取数据
正则表达式的匹配方式,工作流程
正则表达式字符串:
用于描述数据规则的字符串,由一系列特殊符号组成的逻辑语句
Linux下常用的两种正则方式,命令使用正则和函数使用正则。
grep命令(grep “正则表达式” filename)regex族函数
正则表达式基础:特殊符号的含义
\ : 转义符(有特殊含义的字符需要转义)
* : 以前一个字符为参照,匹配该字符0次或多次
^ : 以后一个字符为参照,表示行首
$ : 以前一个字符为参照,表示行尾
. :表示任意字符出现一次
+ :以前一个字符为参照,匹配该字符一次或多次(需要转义\+)
? :表示任意字符出现0次或1次(需要转义\?)
[ ] :表示集合,只代表集合中的一个字符
[^] :代表该集合取非
| :逻辑或 [a|b|c|d](只有在集合中使用不需要转义)
{n} :以前一个字符为参照,表示该字符连续出现的频率(需要转义)
{n,} :以前一个字符为参照,表示该字符最少连续出现n次,最多出现无数次(需要转义)
{n,m} :以前一个字符为参照,表示该字符最少出现n次,最多出现m次(需要转义)
() :可以自定义数据范围(需要转义)
举例:
以h开头o结尾的任意字符串,“^h.*o$”
手机号的正则表达式,“^1[3-8]\{1\}[0-9]\{9\}$”
使用正则函数,匹配抽取关键数据
C标准库正则函数:
regex_t 正则类型
regcomp(regex_t* reg, char* regstring, int flags); \\使用正则字符串,生成正则类型
regexec(regex_t* reg, char* string,int nmatch, rematch_t,int flags);\\使用正则类型,在文本中进行匹配抽取数据,每次返回一条结果
regfree(regex_t* preg);\\释放正则类型
regerror(int errcode, const regex_t* preg, char* errbuf,size_t errbuf_size);\\对正则函数进行错误处理
For example:
<a href=“sina.news.com/cs/dd/2020/text.shtml”>链接标题</a>
正则:使用括号划分子表达式
父表达式:
<a\\[^>\\]\\+\\?href=\\(\\[^\"\\]\\+\\?\.shtml\\)\"\\[^>\\]\\+\\?>\\(\\[^<\\]\\+\\?\\)</a>
子表达式1:
[^"]+?\.shtml \\匹配抽取链接
子表达式2:
[^<]+? \\匹配抽取标题
默认情况下为贪婪模式工作
+?为非贪婪工作模式
regexec(regex_t* reg,char* string,size_t nmatch,rematch_t* pmatch,int eflags);
参数3表达式数量,父表达式与子表达式的总数
参数4传出的位置数组,便于抽取关键数据,位置数组长度与表达式数量一致