/*
原题:“在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。
如:“J* Smi??” 可以匹配“John Smith” .
请用C语言实现如下函数:”
void scan(const char* pszText, const char* pszName);
以下并未完全按要求实现,但意思到了。
GCC 4.5.2
*/
#include <cassert>
#include <iostream>
using namespace std;
char const * regexp_probe(char const * src, char const * pattern)
{
if(!src || !pattern){
return 0;
}
char c = *pattern;
if(isalpha(c) || c == ' '){ // match: a-z, A-Z, <space>
if(*src == c){
if(regexp_probe(src + 1, pattern + 1)){
return src;
}
else{
return 0;
}
}
else{
return 0;
}
}
else if(c == '?'){
if(*src == 0){
return 0;
}
else if(regexp_probe(src + 1, pattern + 1)){
return src;
}
else{
return 0;
}
}
else if(c == '*'){
while(1){
if(regexp_probe(src, pattern + 1)){
return src;
}
else if(*src == 0){
return 0;
}
else{
++src;
}
}
}
else if(c == 0){ // end
return src;
}
else{
assert(false);
}
}
char const * regexp_match(char const * src, char const * pattern)
{
while(*src){
if(regexp_probe(src, pattern)){
return src;
}
++src;
}
if(*pattern == 0){
return src;
}
return 0;
}
void test(char const *src, char const *ptn)
{
cout << "match " << "\"" << src << "\" by pattern " << "\"" << ptn << "\": " << flush;
char const * pt = regexp_match(src, ptn);
cout << (pt ? pt : "<mismatch>") << endl;
}
int main()
{
test("", "");
test("a", "");
test("", "a");
test("a", "a");
test("ab", "a");
test("ca", "a");
test("cab", "a");
test("cab", "a?");
test("ca", "a?");
test("ca", "?a");
test("cab", "?a?");
test("", "?");
test("a", "?");
test("b", "?");
test("abc", "?");
test("", "*");
test("a", "*");
test("a", "a*");
test("a", "*a");
test("ba", "*a");
test("acc", "*a");
test("bbaacc", "*a");
test("abbaacc", "*a?cc*");
test("abbaacc", "abba*ccc");
test("abbaacc", "d*");
test("abbaacc", "*d*");
return 0;
}
实现最简单的正则表达式
最新推荐文章于 2024-01-06 17:34:59 发布