【问题标题】:PigLatin how can I strip punctuation from a string? And Then add it back?PigLatin 如何从字符串中删除标点符号?然后把它加回来?
【发布时间】:2019-05-03 18:46:34
【问题描述】:

正在编写名为 pig Latin 的课程。它适用于我上课所需的东西。它只要求输入要转换的阶段。但我注意到,如果我在最后输入一个带有标点符号的句子,它会弄乱最后一个单词的翻译。试图找出解决此问题的最佳方法。编程新手,但我需要它检查单词中的最后一个字符以检查标点符号。在翻译之前将其删除,然后将其添加回来。不知道该怎么做。一直在阅读 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();
    }

【问题讨论】:

  • 我想先读取每个字符并在末尾去掉标点符号,然后将其添加回末尾。但是,如果我有超过一个句子,那就行不通了。
  • 这只是为了额外的功劳,因为我们没有时间复习这一章。对于额外的信用,只需要输入阶段并让它翻译上面的代码。我只是在玩它,发现问题,我做了 2 句话。我把单词按空格分开。 str.Split(' ') 但最后一个单词和标点符号之间不会有空格。

标签: c# arrays string char


【解决方案1】:

以下内容应该为您提供用于转换的字母字符串,同时传递它们后面的任何非字母字符。

基于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 个组的所有匹配集合。第一组将是 0 个或更多要翻译的字母,然后是第二组要通过的 0 个或更多非字母。 StringBuilder 应该比连接 System.String 值更节省内存。我给它一个初始字符串大小的两倍的起始分配,以避免必须将分配的空间增加一倍。如果内存很紧,也许 1.25 或 1.5 而不是 2 会更好,但之后您可能必须将其转换回 int 。我从您的 Substring 调用中删除了长度计算,因为将其排除在外会抓取到字符串末尾的所有内容。

【讨论】:

  • 不遵循代码的工作方式或使用方法。现在阅读正则表达式。观看一些关于 Regex 的视频我需要添加使用 System.Text.RegularExpressions;使用它?
  • 使用 System.Text.RegularExpressions;去掉了 Match[] 下的红线。但仍在尝试用红线解决 Regex.Matches 的问题。一直在将 Matches 更改为单词, pigTrans 但仍然是红线。
  • 这行代码出错:Match[] matches = Regex.Matches(str, @"([a-zA-Z]*)([^a-zA-Z]* )").Cast().Select(m => m.Value).ToArray();错误 CS0029 无法将类型“string[]”隐式转换为“System.Text.RegularExpressions.Match[]”ClassLibrary
  • 我删除了所有演员表并从另一个答案中选择了一些东西,并坚持使用基本的 MatchCollection 进行迭代。我在 DotNetCore 2.1 中测试了答案,它奏效了。虽然它不处理大写字母的移动,所以句子中的第一个单词看起来很奇怪,但标点符号保持不变。这个特定的函数应该只需要使用 System、System.Text 和 System.Text.RegularExpressions 的语句。
  • 我在这里学习所以 Regex.Matches(str, @"([a-zA-Z]*)([^a-zA-Z]*)");第一组是 ([a-zA-Z]*) 查找字母,第二组有 ^ 我认为它的意思是没有字母。我在玩 TakeWhile(char.IsPunctuation)) 和 TakeWhile(x => !char.IsPunctuation(x)));但现在我将玩弄你的代码并尝试了解它所做的一切。
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
相关资源
最近更新 更多