我想将通过@
开头的所有单词替换为另一个单词,这是我的代码:
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;
时,我想停止递归功能。怎么解决它?
也许另一种方法比递归函数更好。如果你知道另一种方式,请给我一个答案。
答案 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;
}
}