如何在 C# 中替换字符串中的特定字符?

How to replace a particular character from string in c#?

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

一种方法是 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
string original = @"AX_1234X_12345_X_CXY";

original = @"AX_1234_12345_X_CXY";

尝试查看 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;
}

为什么旧的 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

当且仅当这始终是格式,那么合并原始文本的子字符串而不在该位置包含 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"

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

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();
}

像这样的东西可以工作。我确定有更优雅的解决方案。

 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);