如何在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
,即从1234X
到1234
。所以最终输出将类似于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】:为什么不是好旧的IndexOf
和Substring
?
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.IndexOf
或string.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#中替换字符串中的特定字符?的主要内容,如果未能解决你的问题,请参考以下文章