高分求解字符串多模式匹配问题

gefengxztg 2011-06-28 10:53:42
问题如下:
有模式列表,大概10w数量级,如:
*csdn
csdn*
*csdn*
cs*dn
......
(* 表示通配符,可匹配0个或多个)
用户输入一个字符串,比如:csdn
要求输出满足的模式列表,如:*csdn, csdn*, *csdn*, cs*dn

关键是怎么对模式列表建立数据结构, 期待各位大侠的见解!
...全文
321 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gefengxztg 2011-07-10
  • 打赏
  • 举报
回复
解决了,对AC/WM算法做了一点点改进实现了,谢谢大家!
mLee79 2011-07-05
  • 打赏
  • 举报
回复
难道楼上准备10W个模式一个个试...
赵4老师 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]
《代码之美》里面有个简单正则表达式匹配的代码。
[/Quote]
// 字符     含义
// c 匹配任意的字母c
// .(句点)匹配任意的单个字符
// ^ 匹配输入字符串的开头
// $ 匹配输入字符串的结尾
// * 匹配前一个字符的零个或者多个出现
//
/* match: search for regexp anywhere in text */
int match(char *regexp, char *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;
}

/* matchhere: search for regexp at beginning of text */
int matchhere(char *regexp, char *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;
}

/* matchstar: search for c*regexp at beginning of text */
int matchstar(int c, char *regexp, char *text)
{
do { /* a * matches zero or more instances */
if (matchhere(regexp, text))
return 1;
} while (*text != '\0' && (*text++ == c || c == '.'));
return 0;
}
mLee79 2011-07-05
  • 打赏
  • 举报
回复
按正则建 DFA 表, 是正途, 比如这样. 然后把 flex 干的活弄到程序里去做就是了(稍微改改flex的代码就可以了, 把状态数搞大点, 一次处理万把条模式没有问题), 不管模式数量多少, 匹配的时间复杂度是O(LN), 与模式数量无关....



$ cat f.l ; flex -o f.c f.l ; gcc -O3 f.c -lfl -o f; echo casdn csdn TMMD TAMMD | ./f
%{

%}
%option reject caseless


%%

.*csdn { printf("match rule 1.\n"); REJECT; }
c.*sdn { printf("match rule 2.\n"); REJECT; }
cs.*dn { printf("match rule 3.\n"); REJECT; }
.*TMMD { printf("match rule 4.\n"); REJECT; }
T.*MMD { printf("match rule 5.\n"); REJECT; }
.

%%

match rule 4.
match rule 1.
match rule 2.
match rule 2.
match rule 4.
match rule 1.
match rule 4.
match rule 1.
match rule 4.
match rule 1.
match rule 4.
match rule 1.
match rule 4.
match rule 1.
match rule 4.
match rule 1.
match rule 2.
match rule 3.
match rule 4.
match rule 4.
match rule 4.
match rule 4.
match rule 5.
match rule 4.
match rule 5.
match rule 5.
至善者善之敌 2011-07-05
  • 打赏
  • 举报
回复
boost 里有正则库
#include<boost/regex.hpp>
mLee79 2011-07-05
  • 打赏
  • 举报
回复
我不知道那些说NFA正则库的咋弄, 难道一个个试... 晕...
o46382509 2011-07-05
  • 打赏
  • 举报
回复
如果你想自己写的话,给你提供一个算法:KMP算法 字符串匹配算法。
效率还是比较高的。不过没有用boost提供的正则表达式库方便。
Defonds 2011-07-04
  • 打赏
  • 举报
回复
正则库
pathuang68 2011-07-04
  • 打赏
  • 举报
回复
用boost里面的正则库吧
赵4老师 2011-07-04
  • 打赏
  • 举报
回复
《代码之美》里面有个简单正则表达式匹配的代码。
luciferisnotsatan 2011-07-04
  • 打赏
  • 举报
回复
对,用正则表达式
mLee79 2011-07-04
  • 打赏
  • 举报
回复
这个用NFA的正则会死人的... 自己转DFA, 10W模式很easy的说...
quwei197874 2011-07-04
  • 打赏
  • 举报
回复
可以自己写个相似性算法,如lestin。。bk树等
healer_kx 2011-07-04
  • 打赏
  • 举报
回复
Greta,或者Boost里面的正则库,都可以。
ryfdizuo 2011-07-01
  • 打赏
  • 举报
回复
是啊,找 开源C++正则库
yfk 2011-07-01
  • 打赏
  • 举报
回复
百度:
pcre

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧