我有一个字符串:
string val = "123-12-1234";
如何在C#中使用空字符串来替换破折号。
我的意思是val.Replace(char oldChar, newChar);
在oldChar
和newChar
中应该填什么。
我有一个字符串:
string val = "123-12-1234";
如何在C#中使用空字符串来替换破折号。
我的意思是val.Replace(char oldChar, newChar);
在oldChar
和newChar
中应该填什么。
你可以使用一个不同的 Replace()
重载方法,该方法接受字符串作为参数。
val = val.Replace("-", string.Empty)
Replace(';',string.Empty.ToCharArray()[0])
或Replace(";", "")
也可以使用。 - Adam Cox虽然其他回答是正确的,但它们并没有明确解决您最初的疑问,我来解释一下。
如果您调用string.Replace(char oldChar, char newChar)
,它将用另一个字符替换字符的出现。这是一种一对一的替换方法。因此,结果字符串的长度将保持不变。
您想要的是删除破折号,显然这与用另一个字符替换它们不同。您不能用“没有字符”来替换它,因为1个字符始终是1个字符。这就是为什么您需要使用接受字符串的重载方法:字符串可以具有不同的长度。如果您用长度为0的字符串替换长度为1的字符串,则效果是破折号消失了,被“nothing”替换了。
val.Replace("-","");
string val = "123-12-1234";
val = val.Replace("-", ""); // result: 123121234
如果你想用空字符替换字符串中的一个字符,意味着你想从字符串中删除该字符,请阅读R. Martinho Fernandes的答案。
这里是如何从字符串中删除一个字符(用“空字符”替换)的示例:
public static string RemoveCharFromString(string input, char charItem)
{
int indexOfChar = input.IndexOf(charItem);
if (indexOfChar >= 0)
{
input = input.Remove(indexOfChar, 1);
}
return input;
}
或者使用这个版本从字符串中删除所有重复的字符:
public static string RemoveCharFromString(string input, char charItem)
{
int indexOfChar = input.IndexOf(charItem);
if (indexOfChar < 0)
{
return input;
}
return RemoveCharFromString(input.Remove(indexOfChar, 1), charItem);
}
我一直觉得没有办法“从字符串中删除字符”,只能“从字符串中删除字符串”。
我采用了Alexei Bondarev答案的修改版本,并对其进行了基准测试,与标准的string.Replace(string, "")
进行了比较。
| Method | Mean | Error | StdDev | Gen 0 | Allocated |
|--------------------- |---------:|----------:|---------:|-------:|----------:|
| StringReplace | 57.28 ns | 14.701 ns | 0.806 ns | 0.0063 | 40 B |
| RemoveCharFromString | 51.62 ns | 4.604 ns | 0.252 ns | 0.0216 | 136 B |
如您所见,这些结果几乎相同,但是“RemoveCharFromString”分配了3倍的内存。
结论是 - 坚持使用 String.Replace(string, "")
供参考,这是我使用的方法:
public static string RemoveCharFromString(string input, char charItem)
{
int indexOfChar = input.IndexOf(charItem);
while (indexOfChar >= 0)
{
input = input.Remove(indexOfChar, 1);
indexOfChar = input.IndexOf(charItem, indexOfChar);
}
return input;
}
private const string PunctuationChars = ".,!?$";
foreach (var word in words)
{
var word_modified = word;
var modified = false;
foreach (var punctuationChar in PunctuationChars)
{
if (word.IndexOf(punctuationChar) > 0)
{
modified = true;
word_modified = word_modified.Replace("" + punctuationChar, "");
}
}
//////////MORE CODE
}
word_modified.Replace("" + punctuationChar, "");
我有 Razvan Dumitru 的代码的拉丁版,因为我们使用了百万指数。当然,我使用了双重替换 :D
public static string CleanNumb(string numb)
{
foreach (char c in ".,'´")
numb = numb.Replace(c, ' ');
return numb.Replace(" ", "");
}
我一直感到困扰的是,我不能使用String.Remove
方法来删除字符串中的某些字符或字符串实例,因此我通常会将这些扩展方法添加到我的代码库中:
public static class StringExtensions
{
public static string Remove(this string str, string toBeRemoved)
{
return str.Replace(toBeRemoved, "");
}
public static string RemoveChar(this string str, char toBeRemoved)
{
return str.Replace(toBeRemoved.ToString(), "");
}
}
由于 char
类型只能解析为 string.Remove(int startIndex)
,所以无法使用重载语义。"很遗憾"。
当然,这纯粹是美学上的考虑,但我喜欢它……