这道题应该怎么做啊 求解 字符串的模式匹配问题
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"));}
相关文章推荐
- 蛮力法:设计算法求解字符串的模式匹配问题,并编程实现。
- 模式匹配(pattern matching)问题:判断一个长为n的字符串X中是否包含常为m的字串Y(m<=n)
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- (字符串的模式匹配4.7.19——前缀数组suffix的应用)POJ 2752 Seek the Name, Seek the Fame(求解一个字符串中前缀和后缀一样的位置)
- 字符串的模式匹配问题
- 最长公共子串、最长公共子序列、最长回文子串、模式匹配、最大子序列--字符串问题整理
- 练习:KMP(字符串模式匹配问题)
- USTC机试—字符串处理之模式匹配问题
- C语言数据结构之模式匹配字符串定位问题
- 探究一道字符串模式匹配问题
- KMP字符串模式匹配详解
- Lua字符串及模式匹配
- 字符串模式匹配(所谓的kmp)算法
- MySQL中的字符串模式匹配
- 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
- 设计模式怎么解决设计问题
- 字符串模式匹配的BM算法
- 算法:字符串的KMP模式匹配
- 【算法和数据结构】_7_线性结构_字符串_模式匹配
- 字符串多模式精确匹配(脏字/敏感词汇搜索算法)——TTMP算法 之B模式概述