在具有完全匹配的文本中查找所有关键字及其索引c#

时间:2013-10-24 10:32:42

标签: c# regex algorithm full-text-search

我有一个关键字列表和一个搜索它们的文本。我需要获取文本中每个找到的关键字的起始索引,并且匹配必须准确。例如:

keywords=>cat,dog
text=> a catchy cat with a dogged dog

此处只匹配'cat'和'dog'匹配索引必须返回,匹配不应该是'catchy'和'dogged'之类的单词

我尝试了Aho-Corasick Algorithm for string matching,但它也匹配'吸引人'和'顽固'。如何使用c#

对关键字进行精确匹配并返回文本中的索引位置

4 个答案:

答案 0 :(得分:3)

将正则表达式用于边界..

var results= keywords.Select(x=>
                               new
                               {
                                word=x,
                                indexes=Regex.Matches(input,@"\b"+x+@"\b")
                                             .Cast<Match>().Select(y=>y.Index)
                                             .ToList()    
                               }
                            );

您现在可以迭代结果

foreach(var match in results)
{
    match.word;
    foreach(int index in match.indexes)//index
}

答案 1 :(得分:1)

您可以使用Aho-Corasick算法进行一些修改。 对于所有关键字,请在每个关键字的末尾添加单词分隔符(例如空格,点,换行符等)。

因此,如果您有m个关键字并且文本有n种类型的分隔符,您将从n * m个单词构建trie树。

在附加分隔符后,它将不匹配示例中的'catchy'和'dogged'。

编辑:

首先,您最好了解AC算法。

示例:

keywords =&gt; cat,dog and text =&gt;一只带有顽固狗的吸引人的猫

现在更改了keywords =&gt;'cat','dog','cat \ n','dog \ n'(只是追加空格和换行符分隔符)

更改了text =&gt;'带有顽固狗的吸引人的猫\ n'

然后你可以使用标准的Aho-Corasick算法来查找每个关键词的每个索引。

假设文本的长度为n,并且总长度关键字为m,则Aho-Corasick算法具有O(n + m)复杂度,足以用于大文本和大型关键字集。

答案 2 :(得分:0)

希望下面的函数会返回每个关键字的索引列表。

private List<int> GetIndexForKeyWord(string content,string key)
{
    int index = 0;
    List<int> indexes=new List<int>();
    while (index < content.Length && index >= 0)
    {
        index = content.IndexOf(key, index);
        if (index+key.Length==content.Length||index >= 0 && !char.IsLetter(content[index + key.Length]))
        {
            indexes.Add(index);
        }
        if(index!=-1)
            index++;
    }
    return indexes;
}

答案 3 :(得分:0)

按字词拆分文字并将所有字词推入Dictionary<word, index>并查找每个关键字的字典。