【问题标题】:Ignoring white space in palindrome忽略回文中的空白
【发布时间】:2014-10-19 16:00:26
【问题描述】:

我正在编写一个程序来检查一个单词是否是回文。程序本身有效 但是当我输入这行特定的文本“太糟糕了 - 我隐藏了一个靴子”时,它不会拿起它 并忽略空格和连字符。

我查看了以前的问题,但找不到答案。

我的Regex.Replace 不正确吗?

 string s, revs = "";
        Console.WriteLine("Please Enter Word");
        s = Console.ReadLine();
        string r = Regex.Replace(s , @"[^-\s]", "");

        for (int i = s.Length-1; i >= 0; i--)
        {
            revs += s[i].ToString();
        }

        if (revs == s)
        {
            Console.WriteLine("Entered string is palindrome \n String was {0} and reverse string was {1}", s, revs);
        }
        else
        {
            Console.WriteLine("String entered was not palindrome.");
        }
        Console.ReadKey();

【问题讨论】:

  • 你尝试调试了吗?应用替换后的结果是什么?
  • 它只是拾取那行文本而不是回文。好像没什么区别。
  • 我说的是for循环前有断点的结果。
  • 为什么在 string.Replace 上使用可读性较低的正则表达式?

标签: c# regex string palindrome


【解决方案1】:

您的代码包含两个错误:

  • 这是正确的正则表达式条件 @"(\s|-)" 你的替换所有内容,但要删除的字符除外
  • 正如 jeffdot 指出的那样,您正在替换(错误地)但随后针对原始字符串进行测试

这样考虑,正确的代码应该是:

string s, revs = "";
        Console.WriteLine("Please Enter Word");
        s = Console.ReadLine();
        string r = Regex.Replace(s , @"(\s|-)", "");

        for (int i = r.Length-1; i >= 0; i--)
        {
            revs += r[i].ToString();
        }

        if (revs == r)
        {
            Console.WriteLine("Entered string is palindrome \n String was {0} and reverse string was {1}", s, revs);
        }
        else
        {
            Console.WriteLine("String entered was not palindrome.");
        }
        Console.ReadKey();

除了第一个 WriteLine 之外,您应该决定打印什么(因为 revs 不再包含空格和连字符)。

或者如果你只想使用String.Replace,你可以使用它两次:

s=s.Replace(' ','');
s=s.Replace('-','');

【讨论】:

  • 感谢大家的帮助。我现在知道我哪里出错了,看看我应该如何引用 r。
【解决方案2】:

您将 Regex.Replace 调用的结果分配给 string r 并且您从不引用它。这就是您的比较失败的原因。

为了更清楚地说明这一点:您正在删除空格并将该产品引用为 string r,但您正在反转并仅针对 string s 进行测试。

Saverio 还指出您的正则表达式不起作用(我自己没有测试过)。

你有:

    string r = Regex.Replace(s , @"[^-\s]", "");

    for (int i = s.Length-1; i >= 0; i--)
    {
        revs += s[i].ToString();
    }

在那里,您应该迭代和反转r 而不是s——因为s 仍然有它的所有空白。

此外,正如 Saverio 所说,为什么不直接替换?

string r = s.Replace(" ", string.Empty).Reverse();

我没有尝试编译它,但只要您不使用应该可以工作的非常旧版本的 .NET 框架。可能需要您是 using System.Linq 才能使用 Reverse() 扩展名。

【讨论】:

  • 是的,我现在明白你的意思,但我将如何引用字符串 r?
  • 虽然 jeff 关于您没有引用修改后的字符串是正确的,但正如我在回答中指出的那样,您的正则表达式也是错误的。
  • 您是否看到,在将空格替换为字符串 r 之后,您在哪里索引字符串 s?我将在我的回答中添加一些示例,但这应该相对清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
相关资源
最近更新 更多