计算字符串中出现的子串数,而不计算重复项

时间:2017-07-06 14:55:36

标签: c# .net regex string algorithm

例如,我有一个术语列表和一个字符串:

var terms = { "programming language", "programming", "language" };

var content = "A programming language is a formal language that "
    + "specifies a set of instructions that can be used to "
    + "produce various kinds of output.";

我可以使用Regex.Matches(content, term).Count来计算列表中出现的列表有4次:

  • “编程语言”:1次
  • “编程”:1次
  • “语言”:2次

但是有重复,应该只有2次。

我目前的解决方案是保存每次出现的开始索引和结束索引,然后与保存的出现位置进行比较,无论它在何处,并且已经计数。没有使用开始和结束索引有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

根据评论的建议,我使用正则表达式simple solution,它应该使用完整的单词,即programming language可以计算,但programming languages不能:

var pattern = @"(?<!\S)programming language(?![^\s])|(?<!\S)programming(?![^\s])|(?<!\S)language(?![^\s])";
var count = Regex.Matches(content, pattern).Count;

注意:只有在programming languageprogramming条款之前放置language时才能使用此模式。如果有人能提供更好的解决方案,请这样做。