单词短语匹配的单词

时间:2015-11-05 07:40:19

标签: c regex algorithm string-matching

我需要在C中实现一个用于短语匹配/短语识别的算法。具体来说,我有一个在循环中运行的函数,它输出以按字符串筛选一个单词。我将每个输出字放在一个缓冲区中。 我还有一个包含这样一组短语的文件:

短语1:早上好 [姓] [名字] 您的帐户中有 [金额] $。

短语2:会员 [姓氏] [名字] 从列表中选择 [选项]

因此我的集合中的短语具有已知形式,由固定部分和动态部分组成(在 [“”] 之间)。关于动态部分我只知道构成它的单词数量。例如,在短语2中,第一个动态部分有2个单词,第二个动态部分有一个单词。

由于我的缓冲区中填充了函数输出中的单词,我需要确定列表中的哪个短语与缓冲区匹配。

我需要一个关于算法的建议,如果已经有这样的算法可以使用,如果没有,那么在C中这样做的最佳方法是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

我会从像这样的字符指针的锯齿状数组开始

char *phrase1[] = { "Good", "morning", "Mr.", "", "", "you", "have", "", "$", "in", "your", "account.", NULL };
char *phrase2[] = { "Member", "", "", "has", "chosen", "", "from", "the", "list.", NULL };
char **phrases[] = { phrase1, phrase2, NULL };

在每个短语中都有

  • 必须完全匹配的字词,例如"morning"
  • 用于标记动态项目位置的空字符串""
  • NULL指示短语
  • 结尾的指针

使用数组时,phrases[p][i]是短语p中的第i个单词,
phrases[p][i][0]是第{h = 1}}中第i个单词中的第一个字符。

因此,检查动态项目的代码是

p

检查短语的结尾

if ( phrases[p][i][0] == '\0' )
    // this is a dynamic item

否则,要比较单词

if ( phrases[p][i] == NULL )
    // this is the end of the phrase

答案 1 :(得分:0)

假设缺少的单词遵循已知的regex模式,例如[\w\d]+,您可以使用以下格式创建正则表达式:

^(Good morning Mr. [\w\d]+ [\w\d]+ you have [\w\d]+ \$ in your account.)
|(Member [\w\d]+ [\w\d]+ has chosen [\w\d]+ from the list.)
|(...)$

然后将此正则表达式与输入匹配将告诉您哪个子表达式匹配,并且子表达式的索引匹配短语的索引。

这正是flex内部的作用。所以另一种可能性是将匹配的短语作为正则表达式写在flex文件中,并请求flex为您生成匹配器。