无视回文中的空白区域

时间:2014-10-19 16:00:26

标签: c# regex string palindrome

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

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

我的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();

2 个答案:

答案 0 :(得分: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('-','');

答案 1 :(得分:1)

您正在将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()扩展名。