c# - C# 递归方法的意外结果

标签 c# html string text recursion

我有一个相当简单的方法可以递归地删除开始/结束 html 标签

class Program
    {   
        static void Main(string[] args)
        {
            string s = FixHtml("<div><p>this is a <strong>test</strong></p></div>");
            Console.WriteLine(s);
        }

        private static string FixHtml(string s)
        {            
            //Remove any outer <div>
            if (s.ToLower().StartsWith("<div>"))
            {
                FixHtml(s.Substring(5, s.Length - 5));
            }
            else if (s.ToLower().StartsWith("<p>"))
            {
                FixHtml(s.Substring(3, s.Length - 3));
            }
            else if (s.ToLower().EndsWith("</div>"))
            {
                FixHtml(s.Substring(0, s.Length - 6));
            }
            else if (s.ToLower().EndsWith("</p>"))
            {
                FixHtml(s.Substring(0, s.Length - 4));
            }

            return s;
        }
    }

行为是它可以递归地删除 <div> & <p>标签,但在“return s”语句上它撤消了所有工作,通过添加回添加标签!

有人知道为什么会这样吗?以及如何强制它返回我想要的值。即
this is a <strong>test</strong>

最佳答案

在 .NET 中,字符串是不可变的 - 因此您的方法实际上永远不会更改返回值。当您调用 s.ToLower().StartsWith("<div>")你会得到一个具有预期差异的新字符串现有字符串 s 保持不变。

此外,您永远不会使用递归调用的返回值。

在我的脑海中,尝试这样的事情:

    private static string FixHtml(string s)
    {            
        if (s.ToLower().StartsWith("<div>"))
        {
            return FixHtml(s.Substring(5, s.Length - 5));
        }
        else if (s.ToLower().StartsWith("<p>"))
        {
            return FixHtml(s.Substring(3, s.Length - 3));
        }
        else if (s.ToLower().EndsWith("</div>"))
        {
            return FixHtml(s.Substring(0, s.Length - 6));
        }
        else if (s.ToLower().EndsWith("</p>"))
        {
            return FixHtml(s.Substring(0, s.Length - 4));
        }

        return s;
    }

关于c# - C# 递归方法的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1123381/

相关文章:

python - 如何提取名字和姓氏的非大写字符串元素?

java - 字符串操作 - 从字符串中删除字符

c# - DropDownList 中的 ASP.NET Bind() - 字符串值与 Null

javascript - 如何根据另一个输入的值进行输入?

c# - 将 Twilio 的字符串转换为 "URL Safe"字符串

java - Selenium WebDriver - 使用整数变量作为输入字段的值?

javascript - 拒绝在框架中显示,因为它将 'X-Frame-Options' 设置为 'SAMEORIGIN'

java.lang.StringIndexOutOfBoundsException : String index out of range when trying to check if a word is a palindrome

由于导入 C++ DLL,C# ShowDialog() 抛出错误

c# - 如何对键值相同的 List<t> 中的值进行总计