PigLatin如何从字符串中删除标点符号?然后添加回去?

时间:2019-05-03 18:46:34

标签: c# arrays string char

正在为猪的拉丁语类编写程序。它可以满足我上课的需要。它只要求输入要转换的阶段。但是我注意到,如果我在句子的末尾输入标点符号,则会弄乱最后一个单词的翻译。试图找出解决此问题的最佳方法。编程新手,但我需要它来检查单词中的最后一个字符以检查标点符号。在翻译之前将其删除,然后再添加回去。不知道该怎么做。正在阅读有关char.IsPunctuation的内容。另外,不确定该检查我的代码的哪一部分。

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 :(得分:0)

以下内容将为您提供字母字符串,以便在它们后面的任何非字母字符传递时进行转换。

基于Splitting a string in 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();
}

matches变量应包含2组的所有match集合。第一组是要翻译的0个或多个字母,第二组是要传递的0个或多个非字母。与连接System.String值相比,StringBuilder应该具有更高的内存效率。我为它分配了一个初始字符串大小的两倍的起始分配,以避免避免分配的空间增加一倍。如果内存比较紧张,则最好使用1.25或1.5而不是2更好,但是之后可能必须将其转换回int。我从您的Substring调用中删除了长度计算,因为省略它已经将所有内容都捕获到了字符串的末尾。