如何拆分字符串C#并忽略字符串中不完整的单词

时间:2019-01-10 13:17:31

标签: c# arrays string split console

我要执行一项常规功能。我只想在数组中存储完整的单词。不完整的单词应被忽略

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;
}

6 个答案:

答案 0 :(得分:0)

将行char[] arr = new char[19];更改为char[] arr = new char[15];

这将提供您需要的输出。

原因是因为您将大小设为19,并且循环使用了从句子到单词“ lit”的字符,并且句子“ Twinkle twinkle lit”的长度也为19。

谢谢。

答案 1 :(得分:0)

一个大概的解决方案可能看起来像这样:

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();
}

答案 2 :(得分:0)

我不确定自己要达到什么目的,但也许对您有用吗?

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的长度参数化(如果您要这样做)。

答案 3 :(得分:0)

您可以做类似的事情。

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)

答案 4 :(得分:0)

在循环中添加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;
 }`

}

答案 5 :(得分:0)

此代码将解决您的问题。让我知道是否有不清楚的地方。

# ind:  0    1    2    3*    4    5    6    7
x == [1.0, 7.0, 0.0, 11.0, 0.0, 6.0, 0.0, 3.0]