如何拆分字符串 C# 并忽略字符串中的不完整单词
Posted
技术标签:
【中文标题】如何拆分字符串 C# 并忽略字符串中的不完整单词【英文标题】:How to split string C# and ignore the incomplete word from the string 【发布时间】:2019-06-05 09:00:45 【问题描述】:我想做一个通用函数。我只想在数组中存储完整的单词。不完整的单词应该忽略
input Sentence = "Twinkle twinkle little star";
我有一个数组大小 arr [19]。这里的条件是,如果指针指向“liitle”,它将占用“lit”,所以我不希望数组中的拆分词那么我必须删除“little”这个词。想要数组中的完整单词。我想生成以下输出。
output sentence = "Twinkle twinkle"
我尝试了下面的代码,那么我必须添加什么条件才能忽略拆分词
static void Main(string[] args)
string strSentence = "Twinkle twinkle little star";
Console.WriteLine(strRead(strSentence));
Console.ReadLine();
public static string strRead(string str)
char[] arr = new char[19];
string result3 = "";
char[] sSplit = str.ToCharArray();
for (int i = 0; i < arr.Length; i++)
arr[i] = Convert.ToChar(sSplit[i]);
result3 = result3 + arr[i].ToString();
return result3;
【问题讨论】:
它是特定于字符串的吗?它只是针对这个字符串还是多个不同的字符串?你能不能只在 ' ' 上拆分并且只打印前两个单词? 你可以使用String.Split()吗? 我想做一个通用函数。我只想在数组中存储完整的单词。不完整的单词应该被忽略。 什么是不完整的单词?你是怎么把这个通用的? 谁给了-ve评级? 【参考方案1】:将char[] arr = new char[19];
行更改为char[] arr = new char[15];
。
这将提供您需要的输出。
原因是因为您将大小设置为 19,并且在循环中它从句子中提取字符直到单词“lit”,并且句子“Twinkle twinkle lit”的长度也是 19。
谢谢。
【讨论】:
感谢您的回复,但我想做一个通用功能。我只想在数组中存储完整的单词。不完整的单词应该被忽略 为什么不检查循环中的空格,因为通常句子中的单词之间总会有空格。这应该可以解决您的问题。让我知道这是否适合您。 @Bheesham 什么数组?你连单词数组都没有??【参考方案2】:你可以做类似的东西。
public static string strRead(string str,int charCount)
string result3 = "";
var words = str.Split(' ');
var wordsCount = str.Length;
var selectedWordsLength = 0;
var spaceCharLength = 1;
for (int i = 0; i < words.Length; i++)
var word = words[i];
selectedWordsLength += word.Length + (spaceCharLength);
if(selectedWordsLength >=charCount)
break;
result3 = result3 + word + " ";
return result3;
并像这样使用它
strRead(strSentence,19)
【讨论】:
【参考方案3】:在循环中添加if-else条件,如果变量result3的长度等于19则中断
char[] arr = new char[19];
string result3 = "";
char[] sSplit = str.ToCharArray();
for (int i = 0; i
arr[i] = Convert.ToChar(sSplit[i]);
result3 = result3 + arr[i].ToString();
`if(....) //condition here, if result3.length is == 19 since it is a string you can count its length
break;
`
【讨论】:
【参考方案4】:我不太确定你想要达到什么目标,但也许这样的事情对你有用?
var regex = new System.Text.RegularExpressions.Regex(@"^(.0,19)\b(\s|$)");
var matches = regex.Match("Twinkle twinkle little star");
var success = matches.Success; // true
var result = matches.Groups[1]; // Twinkle twinkle
然后您可以将 19
参数化为长度(如果您想要这样做)。
【讨论】:
【参考方案5】:此代码将解决您的问题。如果有不清楚的地方请告诉我。
static void Main(string[] args)
string input = "Twinkle twinkle little star";
int length = 19;
Console.WriteLine(CutOff(input,length));
private static string CutOff(string input, int length)
var solution = input.Substring(0, Math.Min(input.Length, Math.Max(0, length)));
if (solution.ElementAt(solution.Length-1) == ' ')
return solution.Trim();
if (input.ElementAt(solution.Length)!=' ')
var temp = solution.Split(' ');
var result = temp.Take(temp.Count() - 1).ToArray(); //remove the last word
return string.Join(" ", result); //convert array into a single string
return solution;
【讨论】:
@Bheesham 如果这对您来说没问题并且您不需要任何额外的解释,请您标记/接受它吗? 我无法标记它,我是新用户,我的堆栈溢出声誉很低【参考方案6】:有点粗略的解决方案可能如下所示:
private static string CutOff(string input, int length)
if ( length <= 0 ) throw new ArgumentOutOfRangeException(nameof(length));
if (length >= input.Length) return input; //whole input
var index = length - 1;
if (char.IsWhiteSpace(input[index])) return input.Substring(0, length); //just cut off
if (length < input.Length - 1 && !char.IsWhiteSpace(input[length]))
//word continues, search for whitespace character to the left
while (length >= 0 && !char.IsWhiteSpace(input[length]))
length--;
if ( length < 0)
//single long word
return "Can't cut off without breaking word";
//cut off by length
return input.Substring(0, length);
它处理所有情况 - 如果字符串太短,它会返回整个内容。如果截止索引落在空白字符上,我们通常将其剪切。如果它继续,我们搜索最左边的空白。如果我们没有找到任何内容,我们就不能安全地剪切,因为输入是一个长单词。
为了更简单的解决方案,您可以按空格分解输入,然后在符合所需长度的情况下继续添加单词。但是,我的第一个解决方案效率更高,因为它不需要额外的内存,也不需要读取整个字符串。
private static string SplitCut( string input, int length)
var words = input.Split(" ");
StringBuilder builder = new StringBuilder();
foreach (var word in words)
if ( builder.Length + word.Length <= length)
builder.Append(word);
else
//can't add more
break;
if (builder.Length == 0)
return "Can't cut off without breaking word";
return builder.ToString();
【讨论】:
您好,只是第一个解决方案中的一个小错误。如果 index 小于 1,那么您的代码将抛出 IndexOutOfRangeException 异常。 谢谢,bug 已修复,不过我会在这一行添加条件if (length >= input.Length && length < 1 ) return input; //whole input
实际上,在length <= 0
的情况下,抛出 ArgOutOfRangeException 可能是最合适的操作 - 这就是我现在在更新我的答案时所做的。以上是关于如何拆分字符串 C# 并忽略字符串中的不完整单词的主要内容,如果未能解决你的问题,请参考以下文章
Python - 如何在拆分字符串时忽略双引号中的空格? [复制]