如何拆分字符串 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 &gt;= input.Length &amp;&amp; length &lt; 1 ) return input; //whole input 实际上,在length &lt;= 0 的情况下,抛出 ArgOutOfRangeException 可能是最合适的操作 - 这就是我现在在更新我的答案时所做的。

以上是关于如何拆分字符串 C# 并忽略字符串中的不完整单词的主要内容,如果未能解决你的问题,请参考以下文章

在特定字符处拆分字符串但忽略某些情况 C# LINQ

在逗号上拆分字符串并忽略双引号中的逗号[重复]

Python - 如何在拆分字符串时忽略双引号中的空格? [复制]

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

如何将子字符串拆分为多个块并使用 C# 将它们输入到表中?

如何使用字符串中的单词在批处理文件中拆分字符串