您的位置:首页 > 其它

这道题应该怎么做啊 求解 字符串的模式匹配问题

2013-09-20 20:09 316 查看
正则表达式是一个非常强大而实用的东西,可以用一个模式串匹配一系列符合规则的字符串。这次我们要实现的就是一个正则表达式的匹配工具。虽然正则表达式的规则很复杂,但是有几个核心的规则,只要实现就可以处理大多数的问题:c:匹配任意字母c.:匹配任意的单个字符^:匹配输入字符串的开头$:匹配输入字符串的结尾*:匹配前一个字符的零个或者多个出现。例如zo*可以匹配z、zo、zoo、zooo?:匹配前一个字符0次或一次。例如zo?可以匹配z、zo+:匹配前一个字符1次或多次。例如zo+可以匹配zo、zoo、zooo,但是不能匹配z输入第一行为一个正则表达式的模式串,只包含大小写字母和以上字符。1<=串长<=20。数据保证合法。输入第二行开始,每行一个字符串,只包含大小写字母。1<=串长<=100输入以EOF结束。字符串的个数不超过100对于输入的每个字符串,如果模式串可以匹配,输出“YES”,否则输出"NO"Hint:1、^最多只可能在最前出现一次2、$最多只可能在最后出现一次3、?、*、+前一定是一个字母或者.测试输入:
^ab*c?d+.$
b
ad
adb
adcc
abbbbbbbbbbcddddd
测试输出:
NO
NO
YES
NO
YES
//摘自《代码之美》// 字符     含义// .        匹配任意的单个字符// ^        匹配输入字符串的开头// $        匹配输入字符串的结尾// *        匹配前一个字符的零个或者多个出现#include <stdio.h>int matchhere(char *regexp, char *text);//regexp模式串 text匹配字符串int matchstar(int c, char *regexp, char *text) {// matchstar: search for c*regexp at beginning of textdo {// a * matches zero or more instancesif (matchhere(regexp, text)) return 1;} while (*text != '\0' && (*text++ == c || c == '.'));return 0;}int matchhere(char *regexp, char *text){// matchhere: search for regexp at beginning of textif (regexp[0] == '\0') return 1;if (regexp[1] == '*') return matchstar(regexp[0], regexp+2, text);if (regexp[0] == '$' && regexp[1] == '\0') return *text == '\0';if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text)) return matchhere(regexp+1, text+1);return 0;}int match(char *regexp, char *text) {// match: search for regexp anywhere in textif (regexp[0] == '^') return matchhere(regexp+1, text);do{// must look even if string is emptyif (matchhere(regexp, text)) return 1;} while (*text++ != '\0');return 0;}void main() {printf("%d==match(abc ,abc)\n",match("abc" ,"abc"));printf("%d==match(^a  ,abc)\n",match("^a"  ,"abc"));printf("%d==match(c$  ,abc)\n",match("c$"  ,"abc"));printf("%d==match(a.c ,abc)\n",match("a.c" ,"abc"));printf("%d==match(a.*c,abc)\n",match("a.*c","abc"));printf("-------------------\n");printf("%d==match(ABC ,abc)\n",match("ABC" ,"abc"));printf("%d==match(^B  ,abc)\n",match("^B"  ,"abc"));printf("%d==match(A$  ,abc)\n",match("A$"  ,"abc"));printf("%d==match(a..c,abc)\n",match("a..c","abc"));printf("%d==match(a.*d,abc)\n",match("a.*d","abc"));printf("-------------------\n");//printf("%d==match()\n",match("a*b*","aba"));}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: