Как разбить строку C # и игнорировать неполное слово из строки - PullRequest
0 голосов
/ 10 января 2019

Я хочу сделать одну общую функцию. Я хочу хранить только полное слово в массиве. Неполное слово следует игнорировать

input Sentence = "Twinkle twinkle little star"; 

У меня есть размер массива arr [19]. Здесь условие состоит в том, что, если указатель придет к «liitle», он возьмет «до», поэтому я не хочу разделить слово в массиве, тогда я должен отбросить слово «маленький». хочу полные слова в массиве. Я хочу сгенерировать следующий вывод.

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 голосов
/ 14 января 2019

Этот код решит вашу проблему. Дайте мне знать, если есть что-то, что не понятно.

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;
}
0 голосов
/ 10 января 2019

добавить условие if-else в цикл, прервать, если длина переменной result3 равна 19

char[] arr = new char[19];
string result3 = "";
char[] sSplit = str.ToCharArray();

для (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;
 }`

}

0 голосов
/ 10 января 2019

вы можете сделать что-то подобное.

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)
0 голосов
/ 10 января 2019

Я не совсем уверен, чего вы пытаетесь достичь, но может быть что-то подобное может быть полезно для вас?

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 для длины (если это то, что вы хотите сделать).

0 голосов
/ 10 января 2019

Немного грубое решение может выглядеть так:

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();
}
0 голосов
/ 10 января 2019

Измените строку char[] arr = new char[19]; на char[] arr = new char[15];.

Это даст нужный вам вывод.

Причина в том, что вы приняли размер как 19, и в цикле он принимает символ от предложения до слова «горит», а длина предложения «Мерцание мерцания горит» также составляет 19.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...