- #include <stdio.h>
- /*
- * 已实现元字符:
- * . 匹配任意单个字符
- * * 匹配前一个字符任意个出现
- * ^ 匹配输入字符串的开始
- * $ 匹配输入字符串的结尾
- *
- */
- int matchstar(int c, char *regexp, char *text);
- int matchhere(char *regexp, char *text);
- int match(char *regexp, char *text);
- /*
- * 尝试匹配重复的文本字符c
- * 参数:c 单个输入字符,regexp 正则表达式,text 文本字符串
- * 返回值:如果找到了一个匹配的正则表达式则返回1,否则返回0。
- */
- /*
- * 首先去掉文本中字符c的最大重复序列。
- 然后调用 matchhere 来匹配正则表达式和文本的剩余部分。
- 每次匹配失败都会在文本剩余部分的头部中增加一个字符c,然后再次开始尝试。
- */
- int matchstar2(int c, char *regexp, char *text)
- {
- char *t = text;
- while(t[0] != '\\0' && (t[0] == c || c == '.'))
- {
- t++;
- }
- do
- {
- if(matchhere(regexp, t))
- {
- return 1;
- }
- }
- while(t-- > text);
- return 0;
- }
- /*
- * 识别最左边的以及最长的匹配
- 从头开始匹配,如果失败则去掉文本中的第一字符c,再继续匹配,直到匹配完全部文本。
- */
- int matchstar1(int c, char *regexp, char *text)
- {
- do
- {
- if(matchhere(regexp, text))
- {
- return 1;
- }
- }
- while (text[0] != '\\0' && (*text++ == c || c == '.'));
- return 0;
- }
- int matchstar(int c, char *regexp, char *text)
- {
- return matchstar2(c, regexp, text);
- }
- /*
- * 判断正则表达式与文本的开头部分是否匹配
- * 参数:regexp 正则表达式,text 文本字符串
- * 返回值:如果找到了一个匹配的正则表达式则返回1,否则返回0。
- * 细节:把正则表达式的第一个字符与文本的第一个字符进行匹配,
- 如果成功,则推进到正则表达式的下一个字符和文本的下一个字符继续进行匹配,
- 当正则表达式推进到末尾时,即前面的判断都成功,则正则表达式与文本匹配。
- 如果在正则表达式的末尾包含了一个$,那么仅当文本此时位于末尾时匹配成功。
- 如果正则表达式是一个字符后面跟一个*,则调用matchstar来判断闭包是否匹配。
- */
- int matchhere(char *regexp, char *text)
- {
- if(regexp[0] == '\\0')
- {
- return 1;
- }
- if(regexp[0] == '$' && regexp[1] == '\\0')
- {
- return text[0] == '\\0';
- }
- if(regexp[1] == '*')
- {
- return matchstar(regexp[0], regexp+2, text);
- }
- if((regexp[0] == '.' || regexp[0] == text[0]) && (text[0] != '\\0'))
- {
- return matchhere(regexp+1, text+1);
- }
- return 0;
- }
- /*
- * 判断文本中是否出现正则表达式
- * 参数:regexp 正则表达式,text 文本字符串
- * 返回值:如果找到了一个匹配的正则表达式则返回1,否则返回0。
- * 如果有多个匹配的,则将找到文本中最左边的并且最短的那个。
- * 细节:如果正则表达式中的第一个字符是^,那么匹配就一定要出现在字符串的开头,
- 即把正则表达式的剩余部分与文本的起始位置而不是其他地方进行匹配来判断。
- 如果第一个字符不是^,那么就可以在字符串中的任意位置上进行匹配,
- 即把正则表达式依次与文本中的每个字符位置进行匹配来判断。
- */
- int match(char *regexp, char *text)
- {
- if(regexp[0] == '^')
- {
- return matchhere(regexp+1, text);
- }
- do
- {
- if(matchhere(regexp, text))
- {
- return 1;
- }
- }
- while(*text++ != '\\0');
- return 0;
- }
- int main()
- {
- char regexp[] = "^1.*$";
- char text[] = "123";
- if(match(regexp, text))
- {
- puts("ok");
- }
- else
- {
- puts("no");
- }
- return 0;
- }
- //该片段来自于http://www.codesnippet.cn/detail/201120137327.html
来源: http://www.codesnippet.cn/detail/201120137327.html