实现正则表达式的.和*
来源:互联网 发布:文华财经期货 for mac 编辑:程序博客网 时间:2024/06/05 20:18
失败的经历:
1.想用循环来实现,发现基本不可能啊。
2.想用NFA->DFA实现,还是算了吧,又不是真的实现正则表达式引擎。
建议先自己实现,我这边有testCase可以测试,一边调试一边找错,会发现最后的实现很不错。啥都不说了,上代码。
本题目我最招是从coding_interview上看到的,这本书也很是不错。
// How do you implement a function to match regular expressions with ‘.’ and ‘*’ in patterns? The
// character ‘.’ in a pattern matches a single character, and ‘*’ matches zero or any number of characters preceding
// it. Matching means that a string fully matches the pattern where all characters in a string match the whole pattern.
// For example, the string “aaa” matches the pattern “a.a” and the pattern “ab*ac*a”. However, it does not match
// the pattern “aa.a” nor “ab*a”.
#include <stdio.h>
#include <assert.h>
bool match(char* myString, char* pattern){
if(myString == NULL || pattern == NULL){
return false;
}
if(*myString != '\0' && *pattern != '\0'){
if(pattern[1] == '*'){
// this recursive can't be replaced by loop, they work together and coordinate complicatedly
if(*myString == *pattern || *pattern == '.'){
return match(myString, pattern + 2)//skip *
|| match(myString + 1, pattern + 2)//eat a ch and skip *
|| match(myString + 1, pattern)//stay at current parrtern
;
}
else{
return match(myString, pattern + 2);//skip *
}
}
else{
if(*myString == *pattern || *pattern == '.'){
return match(myString + 1, pattern + 1);
}
else{
return false;
}
}
}//for
if(*myString != '\0' || *pattern != '\0'){
return false;
}
return true;
}
//test case 0. NULL , a.a
//test case 0. NULL , NULL
//test case 0. aaa , NULL
//test case 1. aaa , a.a
//test case 1. aaa , a.*a
//test case 2. aaa , ab*ac*a
//test case 3. aaa , aa.a
//test case 4. aaa , ab*a
//test case 4. aaa , .
//test case 4. aaa , * //invalid
//test case 4. aaa , .*
//test case 4. aaa , a.*
//test case 4. aaa , a*
void testCase0(){
bool
result = match(NULL, "a.a");
assert(!result);
result = match(NULL, NULL);
assert(!result);
result = match("aaa", NULL);
assert(!result);
result = match("aaa", "a.a");
assert(result);
result = match("aaa", "a.*a");
assert(result);
result = match("aaa", "ab*ac*a");
assert(result);
result = match("aaa", "aa.a");
assert(!result);
result = match("aaa", "ab*a");
assert(!result);
result = match("aaa", ".");
assert(!result);
result = match("aaa", "*");
assert(!result);
result = match("aaa", ".*");
assert(result);
result = match("aaa", "a.*");
assert(result);
result = match("aaa", "a*");
assert(result);
}
int main(){
testCase0();
}
- 实现正则表达式的.和*
- 实现正则表达式的*和?匹配
- 实现支持“.”和“*”的正则表达式匹配
- Pyton实现简单爬虫和正则表达式的利用
- 正则表达式实现座机和手机的验证
- 简单的正则表达式实现
- IOS正则表达式的实现
- 正则表达式\和/的位置
- 正则表达式*和+的区别
- 正则表达式的符号和常用表达式
- 正则表达式的介绍和常用的正则表达式
- 正则表达式基础知识和ipv4的正则表达式
- POSIX基本正则表达式和扩展正则表达式的比较
- 正则表达式和string对象的正则表达式
- 正则表达式的用法和常用正则表达式大全(转)
- [正则表达式]正则表达式(.*)和(.*?)的字符串匹配问题
- 正则表达式基本语法和常用的正则表达式
- 基本正则表达式和扩展正则表达式的…
- 黑马程序员____基础____IO流
- 求1+2!+3!+...+20!的和。
- 交叉编译alsa-lib
- 鸡兔同笼
- 门径管理系统
- 实现正则表达式的.和*
- 给一个不多于5位的正整数,要求:(1)求它是几位数,(2)逆序打印出各位数字。
- Base64 编解码的C语言实现
- sqlite第三方类库:FMDB使用
- UVALive 5006 (BFS+heap+01背包)
- 关于android 4.2版本的sdcard文件目录分析(含修正)
- 有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
- Linux 文件权限
- 625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?请编写程序,寻找所有这样的3位数:它的平方的末3位是这个数字本身。