正则表达式是一个非常强大而实用的东西,可以用一个模式串匹配一系列符合规则的字符串。这次我们要实现的就是一个正则表达式的匹配工具。
虽然正则表达式的规则很复杂,但是有几个核心的规则,只要实现就可以处理大多数的问题:
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 text do { // a * matches zero or more instances if (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 text if (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 text if (regexp[0] == '^') return matchhere(regexp+1, text); do { // must look even if string is empty if (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")); }