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

问题描述:

我有一个字符串像AX_1234X_12345_X_CXY,我想从第一个下划线_即从1234X1234后删除X。所以最终的输出将会像AX_1234_12345_X_CXY。怎么做??如果我使用.Replace("X", "")它将替换所有X我不想如何从c#中的字符串替换特定的字符?

+1

可能的重复[替换第二次出现?与&(https://*.com/questions/23547100/replace-second-occurence-of-with-an) – Software2

+0

我认为正则表达式将是你的答案。 – Ahmar

+1

'1234'的语义是什么?你想要完成什么,更普遍?它会始终是四位数字后跟一个'X'?提取一般模式,然后使用正则表达式进行搜索和替换。 –

可以遍历槽从'_'中第一次出现的字符串。
您可以使用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(); 
} 

一种方法是String.Remove,因为你可以告诉正是从删除。如果有问题的“X”总是在同一个地方,你可以使用:

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

这将删除1个字符起7位(从零作为字符串的开头算起)。

如果不是总是在相同的字符位置,你可以尝试:

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 
+0

如果字符串中想要的之前有'x',则第二个建议将不起作用。 –

+0

同意。我根据他的确切问题回答了我的答案,这个答案保留了后面输入的X个字符。 – TomServo

+1

我只是想得到nitpicky一秒,并提到你的第二块代码中的变量名是无效的。 –

string original = @"AX_1234X_12345_X_CXY"; 

original = @"AX_1234_12345_X_CXY"; 
+6

那么,它的工作原理... – Adrian

试着看一下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; 
} 
+0

循环不需要,如果只有第二次发生 – eschneider

+0

我们并不真正知道这里的模式。那么如果我们有“AX_1234C_12345_X_CXY”,它会给你一个“AX_1234C_12345__CXY”的结果 –

+0

我们不是这个问题缺乏细节。但我认为使用的主要概念是IndexOf – eschneider

为什么不好老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 
+0

这比我的正则表达式解决方案更快。但是,如果你想让你的解决方案快两倍,那就改为:s = s.Remove(pX,1);而不是你的子串。 –

当且仅当这始终是格式,那么它应该是不包括在该位的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" 
+0

它可以varry,只有条件是在第一个下划线之后,所以它可以是AX_1234X_12345_X_CXY或AX_234X_12345_X_CXY – peter

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

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