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及更高版本中可用。