正则表达式规则及C语言测试代码

本文介绍了正则表达式的规则,包括非打印字符、特殊字符、限定符和定位符等,并探讨了C语言中如何利用POSIX辅助库进行正则表达式测试,提供了测试代码及其运行结果。
摘要由CSDN通过智能技术生成

正则表达式规则

规则数据来源于runoobcom,如果侵权,请告知删除,谢谢。

-非打印字符

字符 描述
\f 匹配一个换行符,等价于\x0x和\cL
\n 匹配一个换行符,等价于\0x0a和\cJ
\r 匹配一个回车符,等价于\x0d和\cM
\t 匹配一个制表符,等价于\0x09和\cl
\v 匹配一个垂直制表符,等价于\x0b和\cK
\s 匹配任何空白字符,包括空格、制表符、换行符等等,等价于[\f\n\r\t\v]
\S 匹配任何非空白字符,等价于[^ \f\n\r\t\v]

-特殊字符
这里写图片描述

-限定符

字符 描述
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
* 匹配前面的子表达式零次或多次,例如,zo*能匹配”zo”以及”zoo”
+ 配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。

*、+限定符都是贪婪的,它们会尽可能多的匹配文字,只要在后面加上?就可以实现非贪婪。
有如下Xml字符串

<H1>Chapter 1 – Introduction to Regular Expressions</H1>

如果需要匹配标签页需要使用,

好的,以下是一个简单的正则表达式引擎的设计思路,使用flex和C语言: 1. 定义输入和输出 输入:一个正则表达式和一个字符串 输出:一个布尔值,表示字符串是否匹配正则表达式 2. 编写正则表达式的词法规则 使用flex编写正则表达式的词法规则,例如:字母、数字、括号、星号、加号等等。在词法规则中,需要定义一些特殊符号的token,例如:DOT表示".",STAR表示"*",PLUS表示"+",QUESTION表示"?",LBRACKET表示"[",RBRACKET表示"]"等等。 3. 编写正则表达式的语法规则 使用C语言编写正则表达式的语法规则,例如:定义解析器的数据结构、解析器的遍历和匹配逻辑等等。在语法规则中,需要定义一些非终结符和终结符,例如:expression表示正则表达式,factor表示正则表达式的基础单元,例如字母、数字、括号等等。 4. 实现字符串匹配逻辑 在解析器中,根据语法规则进行匹配。例如, - 对于".",匹配任意一个字符; - 对于"*",匹配前面的字符出现0次或多次; - 对于"+",匹配前面的字符出现1次或多次; - 对于"?",匹配前面的字符出现0次或1次; - 对于"[]",匹配括号内的任意一个字符。 5. 对正则表达式引擎进行测试 编写一些测试用例,测试正则表达式引擎的正确性和性能。 以下是一个简单的正则表达式引擎的代码示例,使用flex和C语言实现: ``` %{ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> typedef struct { bool success; int pos; } Result; %} %option noyywrap DOT "." STAR "*" PLUS "+" QUESTION "?" LBRACKET "\[" RBRACKET "\]" %% expression: factor | expression PIPE factor ; factor: atom | atom STAR | atom PLUS | atom QUESTION ; atom: CHAR | DOT | LBRACKET CHARSET RBRACKET | LPAREN expression RPAREN ; CHAR: [a-zA-Z0-9] ; CHARSET: CHAR | CHAR "-" CHAR ; LPAREN: "(" ; RPAREN: ")" ; PIPE: "|" ; %% Result match(const char* regex, const char* str) { Result result = {false, 0}; YY_BUFFER_STATE buffer = yy_scan_string(regex); yy_switch_to_buffer(buffer); if (yyparse(str) == 0) { result.success = true; } yy_delete_buffer(buffer); return result; } int main(int argc, char* argv[]) { if (argc != 3) { fprintf(stderr, "Usage: %s <regex> <string>\n", argv[0]); return 1; } Result result = match(argv[1], argv[2]); printf("%s\n", result.success ? "Match" : "Not match"); return 0; } int yyerror(const char* msg) { return 1; } int yywrap() { return 1; } ``` 在这个示例中,使用了flex的词法规则C语言的语法规则,实现了一个简单的正则表达式引擎,能够匹配常见的正则表达式语法。其中,match函数实现了字符串的匹配逻辑,main函数用于测试,yyerror和yywrap函数用于错误处理和结束处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值