如何在 C# 中替换两次字符?



我有一个字符串"%hello%",我想"{hello}"获取输出。 我尝试了我所有的想法,但没有工作或没有编译。 我现在添加了编译错误,我知道问题出在数组索引中。 这是我的代码:


char[] charArr = vars.xyz.ToCharArray();
StringBuilder asda = new StringBuilder(vars.xyz);
foreach (char ch in charArr)
{
vars.count++;
vars.charArrayCounter++;
if (ch.Equals('%'))
{
vars.charCounter++;
}
switch (vars.charCounter)
{
case 1:
asda[vars.charArrayCounter - 1] = '{';
break;
case 2:
asda[vars.charArrayCounter - 1] = '{';
vars.charCounter = 0;
break;
}
}

我收到编译错误:

System.ArgumentOutOfRangeException:"索引超出范围。必须是非负数且小于集合的大小。

排队:asda[vars.charArrayCounter - 1] = '{';

var asda = System.Text.RegularExpressions.Regex.Replace(vars.xyz, @"%([^%]+)%", "{$1}");

你处理索引是容易出错的,特别是如果你把它们作为全局状态。

如果我保持接近你现在拥有的内容,我建议通过逐个附加一个字符来构建 StringBuilder,并保持状态以了解您是否遇到%字符,以便您知道需要附加什么。这通过简单地从循环中省略索引操作来解决索引超出范围的问题。

如果我假设你的vars是这样的:

static class vars
{
public static string xyz ="%hello%"; 
}

该代码可能如下所示:

char[] charArr = vars.xyz.ToCharArray();
StringBuilder asda = new StringBuilder();
var state = 0; // counter for 1st or 2nd replace
foreach (char ch in charArr)
{
if (ch.Equals('%'))
{
switch(state)
{
case 0: // first
asda.Append('{');     
break;
case 1: //second
asda.Append('}');     
break;
default:
// error? because we have now found 3 % chars
break;
}
state++; // counter goes up
} else {
asda.Append(ch);  // add to the stringbuilder
}
}

这在我的测试中输出 {hello}。它将为 %hel%lo% 生成结果 {hel}lo%,但您可以知道某些内容已关闭,因为状态将> 1。

更短的替代方法(打开新的错误情况(,但省略任何循环,利用 String 类的 IndexOf 和 LastIndexOf 方法

StringBuilder asda2 = new StringBuilder(vars.xyz);
asda2[vars.xyz.IndexOf('%')]='{';
asda2[vars.xyz.LastIndexOf('%')]='}';

这对于输入 %hel%lo% 的结果 {hel%lo} 具有好处,这可能是更可取的。请检查输入是否为 %,或者它失败了。我把它留给其他人来解决。

最新更新