【问题标题】:How to replace a particular character from string in c#?如何在c#中替换字符串中的特定字符?
【发布时间】:2017-11-23 12:32:53
【问题描述】:

我有一个类似AX_1234X_12345_X_CXY 的字符串,我想从第一个下划线 _ 之后删除X,即从1234X1234。所以最终输出将类似于AX_1234_12345_X_CXY。怎么做??如果我使用.Replace("X", ""),它将替换我不想要的 all X

【问题讨论】:

  • 我认为正则表达式将是您的答案。
  • 1234的语义是什么?更一般地说,您要完成什么?是否总是四位数字后跟X?提取一个通用模式,然后使用正则表达式进行搜索和替换。
  • 最终输出不是“AX_1234_12345__CXY”还是我遗漏了什么?
  • 可以变化,只有条件在第一个下划线之后,所以可以是AX_1234X_12345_X_CXY或者AX_234X_12345_X_CXY

标签: c# asp.net .net visual-studio-2010


【解决方案1】:

您可以从第一次出现 '_' 开始遍历字符串。
您可以使用 IndexOf() 找到第一次出现的 '_'
当循环到达“X”时,它不会将其附加到“固定字符串”。

private static void Func()
{
    string Original = "AX_1234X_12345_X_CXY";
    string Fixed = Original.Substring(0, Original.IndexOf("_", 0));
    // in case you want to remove all 'X`s' after first occurrence of `'_'` 
    // just dont use that variable
    bool found = false; 

    for (int i = Original.IndexOf("_", 0); i < Original.Length; i++)
    {
        if (Original[i].ToString()=="X" && found == false)
        {
            found = true;
        }
        else
        {
            Fixed += Original[i];
        }
    }

    Console.WriteLine(Fixed);
    Console.ReadLine();
}

【讨论】:

    【解决方案2】:

    为什么不是好旧的IndexOfSubstring

      string s = "AX_1234X_12345_X_CXY";
    
      int pUnder = s.IndexOf('_');
    
      if (pUnder >= 0) { // we have underscope...
        int pX = s.IndexOf('X', pUnder + 1); // we should search for X after the underscope
    
        if (pX >= 0) // ...as well as X after the underscope
          s = s.Substring(0, pX) + s.Substring(pX + 1);
      }
    
      Console.Write(s);
    

    结果:

      AX_1234_12345_X_CXY
    

    【讨论】:

    • 这比我的正则表达式解决方案快。但是,如果您想让解决方案的速度提高一倍,请改为执行以下操作: s = s.Remove(pX, 1);而不是你的子字符串。
    【解决方案3】:
    string original = @"AX_1234X_12345_X_CXY";
    
    original = @"AX_1234_12345_X_CXY";
    

    【讨论】:

      【解决方案4】:

      一种方法是 String.Remove,因为您可以准确地知道从哪里删除。如果有问题的“X”总是在同一个地方,你可以使用:

      string newString = old.Remove(7,1);
      

      这将删除从位置 7 开始的 1 个字符(从零开始计数作为字符串的开头)。

      如果不总是在同一个字符位置,你可以试试:

      int xPos = old.IndexOf("X");
      string newString = old.Remove(xPos,1);
      

      编辑:

      根据 OP 评论,我们定位的“X”恰好出现在 第一个下划线字符之后,所以让我们从第一个下划线开始索引:

      int iPosUnderscore = old.IndexOf("_");
      string newString = old.Remove(iPosUnderscore + 1 ,1); // start after the underscore
      

      【讨论】:

      • 如果字符串中您想要的前面有一个“x”,则第二个建议将不起作用。
      • 同意。我的回答基于他的确切问题,该问题保留了输入中稍后出现的 X 字符。
      • 我只是要吹毛求疵,并提到您在第二段代码中的变量名无效。
      • @JLH 可以变化,只有条件在第一个下划线之后,所以可以是AX_1234X_12345_X_CXY或者AX_234X_12345_X_CXY
      • @peter 明白了,请参阅我编辑的示例,该示例考虑了该要求。
      【解决方案5】:

      尝试查看string.IndexOfstring.IndexOfAny

      string s = "AX_1234X_12345_X_CXY";
      string ns = HappyChap(s);
      
      public string HappyChap(string value)
      {
              int start = value.IndexOf("X_");
              int next = start;
      
              next = value.IndexOf("X_", start + 1);
              if (next > 0)
              {
                  value = value.Remove(next, 1);
              }
      
              return value;
      }
      

      【讨论】:

      • 如果只出现第二次则不需要循环
      • 我们并不真正了解这里的模式。那么如果我们有“AX_1234C_12345_X_CXY”,它会给你一个“AX_1234C_12345__CXY”的结果
      • 我们的问题不是缺少细节。但我认为使用的主要概念是 IndexOf
      【解决方案6】:

      当且仅当这始终是格式,那么合并原始文本的子字符串而不在该位置包含 x 应该是一件简单的事情。但是操作并没有说明情况总是如此。因此,如果这始终是格式并且始终删除相同的字符位置,那么您可以简单地

          string s = "AX_1234X_12345_X_CXY";
          string newstring = s.Substring(0, 7) + s.Substring(8);
      

      好的,仅基于第二组数字的长度可变,您可以执行以下操作:

      int startpos = s.IndexOf('_', 4);
      string newstring = s.Substring(0, startpos - 1) + s.Substring(startpos);
      

      使用此代码,结果如下:

      "AX_1234X_12345_X_CXY" became "AX_1234_12345_X_CXY"
      "AX_123X_12345_X_CXY"  became "AX_123_12345_X_CXY"
      "AX_234X_12345_X_CXY"  became "AX_234_12345_X_CXY"
      "AX_1X_12345_X_CXY"    became "AX_1_12345_X_CXY"
      

      【讨论】:

      • 可以变化,只有条件在第一个下划线之后,所以可以是AX_1234X_12345_X_CXY或者AX_234X_12345_X_CXY
      【解决方案7】:

      这样的事情可能会奏效。我确信有一个更优雅的解决方案。

       string input1 = "AX_1234X_12345_X_CXY";
       string pattern1 = "^[A-Z]{1,2}_[0-9]{1,4}(X)";
       string newInput = string.Empty;
       Match match = Regex.Match(input1, pattern1);
       if(match.Success){
          newInput =  input1.Remove(match.Groups[1].Index, 1);
       }            
       Console.WriteLine(newInput);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        • 2012-01-07
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多