繁体   English   中英

如何在 C# 中将 char 替换两次?

[英]How to replace char two times in C#?

我有一个字符串"%hello%" ,我想得到 output "{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}");

您处理索引很容易出错,特别是如果您有全局 state。

如果我与您现在所拥有的保持接近,我建议通过逐个附加一个字符来构建 StringBuilder 并让 state 知道您是否遇到%字符,这样您就知道您需要 append 来代替。 这通过简单地从循环中省略索引操作来解决索引超出范围异常。

如果我假设您的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% 但您可以知道有些东西已经关闭,因为 state 将 > 1。

更短的替代方案(打开新的错误案例)但省略任何循环,利用 String class 的 IndexOf 和 LastIndexOf 方法

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM