如何从c#中的字符串替换特定的字符?
我有一个字符串像AX_1234X_12345_X_CXY
,我想从第一个下划线_
即从1234X
到1234
后删除X
。所以最终的输出将会像AX_1234_12345_X_CXY
。怎么做??如果我使用.Replace("X", "")
它将替换所有X
我不想如何从c#中的字符串替换特定的字符?
可以遍历槽从'_'
中第一次出现的字符串。
您可以使用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
如果字符串中想要的之前有'x',则第二个建议将不起作用。 –
同意。我根据他的确切问题回答了我的答案,这个答案保留了后面输入的X个字符。 – TomServo
我只是想得到nitpicky一秒,并提到你的第二块代码中的变量名是无效的。 –
string original = @"AX_1234X_12345_X_CXY";
original = @"AX_1234_12345_X_CXY";
那么,它的工作原理... – Adrian
试着看一下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;
}
循环不需要,如果只有第二次发生 – eschneider
我们并不真正知道这里的模式。那么如果我们有“AX_1234C_12345_X_CXY”,它会给你一个“AX_1234C_12345__CXY”的结果 –
我们不是这个问题缺乏细节。但我认为使用的主要概念是IndexOf – eschneider
为什么不好老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);而不是你的子串。 –
当且仅当这始终是格式,那么它应该是不包括在该位的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"
它可以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);
可能的重复[替换第二次出现?与&(https://stackoverflow.com/questions/23547100/replace-second-occurence-of-with-an) – Software2
我认为正则表达式将是你的答案。 – Ahmar
'1234'的语义是什么?你想要完成什么,更普遍?它会始终是四位数字后跟一个'X'?提取一般模式,然后使用正则表达式进行搜索和替换。 –