如何在 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.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;
}
为什么旧的 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
当且仅当这始终是格式,那么合并原始文本的子字符串而不在该位置包含 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);
我有一个像 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.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;
}
为什么旧的 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
当且仅当这始终是格式,那么合并原始文本的子字符串而不在该位置包含 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);