C#公共子字符串列表/提取

C#公共子字符串列表/提取,c#,.net,regex,string,substring,C#,.net,Regex,String,Substring,我的目标是运行字符串数据库,并在每次出现子字符串时获取计数。换句话说,我需要从字符串中提取所有可能的单词组合 例如,输入可能是“这是第一个字符串” 我想提取“这是”,“是”,“第一个”,“第一个字符串”,“这是”,“是第一个”,“第一个字符串”,“这是第一个”,“是第一个字符串” 我只需要按顺序从左向右走 我真的不知道从哪里开始。我已经有了读取数据库并保存到列表中的代码,只需要知道如何根据空格字符提取所有可能的子字符串。如何使用,然后您就有了所有单个单词,并且只需要可能的组合 执行上述操作的简单

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

例如,输入可能是
“这是第一个字符串”

我想提取
“这是”
“是”
“第一个”
“第一个字符串”
“这是”
“是第一个”
“第一个字符串”
“这是第一个”
“是第一个字符串”

我只需要按顺序从左向右走

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

如何使用,然后您就有了所有单个单词,并且只需要可能的组合

执行上述操作的简单示例:

        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
string input=“这是第一个字符串”;
var项目=输入。拆分(“”);
var result=新列表();
//这只能得到两个单词的组合
对于(var i=0;i
使用怎么样?然后你就有了所有的单字,只需要可能的组合

执行上述操作的简单示例:

        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
string input=“这是第一个字符串”;
var项目=输入。拆分(“”);
var result=新列表();
//这只能得到两个单词的组合
对于(var i=0;i
一种方法可能是:

myString.Split()
如果不提供任何参数,它将分割字符串,忽略空格字符(制表符、换行符(s.a.Environment.newline)等)

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

一种方法可能是:

myString.Split()
如果不提供任何参数,它将分割字符串,忽略空格字符(制表符、换行符(s.a.Environment.newline)等)

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

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

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

列出单词组合(字符串短语)
    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;
    }
{ 列表组合=新列表(); string[]words=phrase.Split(); //我们需要所有2个单词组合,然后3个,然后4个。。。 for(int take=2;take列出单词组合(字符串短语) { 列表组合=新列表(); string[]words=phrase.Split(); //我们需要所有2个单词组合,然后3个,然后4个。。。 for(int take=2;take对于(int skip=0;skip+take,以下方法建立字符串中所有空格的索引列表(加上概念上的起始和结束空格),然后返回每个有序索引对之间的子字符串:

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);
}
它给


minLength
更改为
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);
}
它给


minLength
更改为
2
将删除单个单词返回。

如果任何三个或更多单词的子字符串必须包含两个单词的子字符串,则只需实际搜索包含两个单词的子字符串。请选择组合“这是第一个字符串”这不是一个允许的组合?…无论如何,这看起来像是一个递归算法刚刚回答了一个类似的问题,但是如果只需要使用正则表达式的
n
单词的短语,我想知道是否有正则表达式可以解决这个问题。前提是任何三个单词或more必须包含两个单词的子字符串,您只需实际搜索包含两个单词的子字符串。舒尔组合“这是第一个字符串”这不是一个允许的组合?…无论如何,这看起来像是一个递归算法刚刚回答了一个类似的问题,但是如果只需要
n
单词的短语,并使用正则表达式,我想知道是否有正则表达式可以解决这个问题。@Beachwalker:有一个
字符串。Join
m采用
IEnumerable
:的方法;原始代码有效。@MichaeEdenfield Ah,在3.5框架中尝试过。IEnumerable的重载在4.0及更高版本中可用。@Beachwalker:有一个
字符串。Join
方法采用
IEnumerable
:;原始代码有效。@MichaeEdenfield Ah,在3.5中尝试过IEnumerable的重载在4.0及更高版本中可用。