C# - 如何停止递归函数?

时间:2017-04-29 17:20:49

标签: c#

我想将通过@开头的所有单词替换为另一个单词,这是我的代码:

    public string SemiFinalText { get; set; }
    public string FinalText { get; set; }

    //sample text : "aaaa bbbb @cccc dddd @eee fff g"
    public string GetProperText(string text)
    {

        if (text.Contains('@'))
        {
            int index = text.IndexOf('@');
            string restText = text.Substring(index);
            var indexLast = restText.IndexOf(' ');
            var oldName = text.Substring(index, indexLast);
            string restText2 = text.Substring( index + indexLast);
            SemiFinalText += text.Substring(0, index + indexLast).Replace(oldName, "@New");

            if (restText2.Contains('@'))
            {
                GetProperText(restText2);
            }

            FinalText = SemiFinalText + restText2;

            return FinalText;
        }
        else
        {
            return text;
        }
    }

执行return FinalText;时,我想停止递归功能。怎么解决它?

  

也许另一种方法比递归函数更好。如果你知道另一种方式,请给我一个答案。

3 个答案:

答案 0 :(得分:1)

您不需要针对此问题的递归解决方案。你有一个包含许多单词的字符串(用空格分隔),你想要替换以' @'开头的字符串。用另一个字符串。修改你的解决方案,让你有一个基于空格分割的简单方法,替换所有以@开头的单词,然后再将它们组合起来。

使用Linq:

string text = "aaaa bbbb @cccc dddd @eee fff g";
FinalText = GetProperText(text, "New");

public string GetProperText(string text, string replacewith)
{
    text = string.Join(" ", text.Split(' ').Select(x => x.StartsWith("@") ? replacewith: x));
    return text;
}

输出:aaaa bbbb New dddd New fff g

使用Regex:

Regex rgx = new Regex("@([^ @])*");
string result = rgx.Replace(text, replaceword);

答案 1 :(得分:1)

使用正则表达式的解决方案:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string pattern = @"@\w+";
        var r = new Regex(pattern);
        Console.WriteLine(r.Replace("ABC @ABC ABC @DEF klm.@bhsh", "BOOM!"));
    }
}

这不依赖于空格字符作为分隔符,任何非单词(字母和数字)都可用于分隔“单词”。这个例子输出:

  ABC BOOM! ABC BOOM! klm.BOOM!

您可以在此处测试:https://dotnetfiddle.net/rZyjjg

如果您是Regex的新手:.NET Introduction to Regular Expressions

答案 2 :(得分:0)

这里也是以递归方式为感兴趣的人提供的正确方法。我认为你的停止条件实际上是oke,但你应该将递归函数调用的结果连接到已处理的文本。此外,我认为在递归函数中使用全局变量会稍微违背其目的。

话虽如此,我认为从提供的答案中使用RegEx会更好更快。

递归代码:

    //sample text : "aaaa bbbb @cccc dddd @eee fff g"
    public string GetProperText(string text)
    { 
        if (text.Contains('@'))
        {
            int index = text.IndexOf('@');            //Index of first occuring '@'
            var indexLast = text.IndexOf(' ',index);  //Index of first ' ' after '@'

            var oldName = text.Substring(index, indexLast);     //Old Name
            string processedText = text.Substring(0, index + indexLast).Replace(oldName, "New");    //String with new name
            string restText = text.Substring(indexLast);   //Rest Text

            if (text.Contains('@'))
            {
                //Here the outcome of the function is pasted on the allready processed text part.
                text = processedText + GetProperText(restText);
            }

            return text;
        }
        else
        {
            return text;
        }
    }