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

Posted

技术标签:

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

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

【问题讨论】:

Replace second occurence of ? with an &的可能重复 我认为正则表达式将是您的答案。 1234的语义是什么?更一般地说,您要完成什么?是否总是四位数字后跟X?提取一个通用模式,然后使用正则表达式进行搜索和替换。 最终输出不是“AX_1234_12345__CXY”还是我遗漏了什么? 可以变化,只有条件在第一个下划线之后,所以可以是AX_1234X_12345_X_CXY或者AX_234X_12345_X_CXY 【参考方案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);

【讨论】:

以上是关于如何在c#中替换字符串中的特定字符?的主要内容,如果未能解决你的问题,请参考以下文章

c#中特定位置的字符串替换

如何替换文件中的特定字符

C# 如何高效替换一个字符串中的全部某字符?

在 C# 中将字符串中的“\\”替换为“\”

C#如何替换字符串中的第一个单词

如何使用特定符号 C++ 查找和替换字符串中的所有字符