PigLatin, как я могу удалить пунктуацию из строки?А потом добавить обратно? - PullRequest
0 голосов
/ 03 мая 2019

Работа над программой для класса вызова свиньи латыни.Это работает для того, что мне нужно для класса.Он просит просто ввести фазу для преобразования.Но я замечаю, что если я напишу предложение с пунктуацией в конце, это испортит перевод последнего слова.Попытка выяснить лучший способ исправить это.Новичок в программировании, но мне нужно, чтобы он проверял последний символ в слове, чтобы проверить пунктуацию.Удалите его перед переводом и затем добавьте обратно.Не уверен, как это сделать.Читал о чар. Пунктуация.Кроме того, я не уверен, какая часть моего кода у меня была бы для этой проверки.

public static string MakePigLatin(string str)
    {
        string[] words = str.Split(' ');
        str = String.Empty;
        for (int i = 0; i < words.Length; i++)
        {
            if (words[i].Length <= 1) continue;
            string pigTrans = new String(words[i].ToCharArray());
            pigTrans = pigTrans.Substring(1, pigTrans.Length - 1) + pigTrans.Substring(0, 1) + "ay ";
            str += pigTrans;
        }
        return str.Trim();
    }

1 Ответ

0 голосов
/ 03 мая 2019

Ниже приведены строки букв для преобразования при прохождении через любые не буквенные символы, следующие за ними.

Разделитель на основе Разделение строки в C #

public static string MakePigLatin(string str) {
    MatchCollection matches = Regex.Matches(str, @"([a-zA-Z]*)([^a-zA-Z]*)");
    StringBuilder result = new StringBuilder(str.Length * 2);
    for (int i = 0; i < matches.Count; ++i) {
        string pigTrans = matches[i].Groups[1].Captures[0].Value ?? string.Empty;
        if (pigTrans.Length > 1) {
            pigTrans = pigTrans.Substring(1) + pigTrans.Substring(0, 1) + "ay";
        }
        result.Append(pigTrans).Append(matches[i].Groups[2].Captures[0].Value);
    }
    return result.ToString();
}

Переменная совпадений должна содержать все коллекции совпадений из 2 групп. Первая группа будет 0 или более букв для перевода, а затем вторая группа из 0 или более не букв, чтобы пройти. StringBuilder должен быть более эффективным с точки зрения памяти, чем объединение значений System.String. Я дал ему начальное распределение удвоенного начального размера строки, чтобы избежать необходимости удваивать выделенное пространство. Если объем памяти невелик, возможно, лучше было бы использовать 1,25 или 1,5 вместо 2, но вам, вероятно, придется преобразовать его обратно в int после. Я снял вычисление длины с вашего вызова Substring, потому что, оставив его вне, он захватывает все до конца строки.

...