C#common substring list / extraction

时间:2013-01-22 12:49:30

标签: c# .net regex string substring

我的目标是遍历字符串数据库,并在每次子字符串出现时获取计数。换句话说,我需要从字符串中提取所有可能的单词组合。

例如,输入可能是"this is the first string"

我想提取"this is""is the""the first""first string""this is the""is the first""the first string""this is the first""is the first string"

我只需要从左到右,总是按顺序。

我不确定从哪里开始。我已经有了读取数据库并保存到列表中的代码,只需要知道如何根据空格字符提取所有可能的子字符串。

5 个答案:

答案 0 :(得分:2)

    List<string> WordCombinations(string phrase)
    {
        List<string> combinations = new List<string>();

        string[] words = phrase.Split();

        // We want all 2 word combinations, then 3, then 4, ...
        for (int take = 2; take < words.Length; take++)
        {
            // Start with the first word, then second, then ...
            for (int skip = 0; skip + take <= words.Length; skip++)
            {
                combinations.Add(string.Join(" ", words.Skip(skip).Take(take).ToArray()));
            }
        }

        return combinations;
    }

答案 1 :(得分:2)

以下方法构建字符串中所有空格的索引列表(加上名义的起始和结束空格),然后返回每个有序索引对之间的子字符串:

static IEnumerable<string> SpaceDelimitedSubstrings(string input)
{
    List<int> indices = new List<int> { -1 };
    int current = -1;
    while ((current = input.IndexOf(' ', current + 1)) > -1)
    {
        indices.Add(current);
    }
    indices.Add(input.Length);

    int minLength = 1;
    for (int i = 0; i < indices.Count - minLength; i++)
        for (int j = i + minLength; j < indices.Count; j++)
            yield return input.Substring(indices[i] + 1, indices[j] - indices[i] - 1);
}

如下所示

string input = "this is the first string";
foreach (var s in SpaceDelimitedSubstrings(input))
{
    Console.WriteLine(s);
}

它给出了

this

minLength更改为2会删除单字返回。

答案 2 :(得分:0)

使用String.Split()?怎么样然后你有所有单词,只需要可能的组合。

做上述事情的简单示例:

        string input = "this is the first string";

        var items = input.Split(' ');
        var result = new List<string>();

        // this gets only 2-word-combinations
        for (var i = 0; i < items.Count() - 1; i++)
        {
            result.Add(items[i] + " " + items[i + 1]);
        }

        // from this point: search the 3-words etc. or put this in recursion

答案 3 :(得分:0)

一种方式可能是:

myString.Split()

如果你不提供任何参数,它将拆分字符串忽略空格字符(制表符,换行符(s.a. Environment.NewLine)等)。

当你拥有所有子串时,你可以轻松地通过它们。 请记住,这可能会很慢,因为每次都必须通过字符串来提取子字符串。

答案 4 :(得分:0)

您可以使用String.Split()将字符串解析为令牌。然后,您可以组合这些令牌以创建所需的组合。