C#从字符串中删除不需要的字符
本文关键字:不需要 字符 删除 字符串 | 更新日期: 2023-09-27 18:20:14
我查看过其他帖子,它们都有已知的不需要的字符。就我而言,我有一堆我想要的角色,我只想保留这些。
我的代码太乱了:
private string RemoveUnwantedChar(string input)
{
string correctString = "";
for (int i = 0; i < input.Length; i++)
{
if (char.IsDigit(input[i]) || input[i] == '.' || input[i] == '-' || input[i] == 'n'
|| input[i] == 'u' || input[i] == 'm' || input[i] == 'k' || input[i] == 'M'
|| input[i] == 'G' || input[i] == 'H' || input[i] == 'z' || input[i] == 'V'
|| input[i] == 's' || input[i] == '%')
correctString += input[i];
}
return correctString;
}
我想要的字符:0123456789
和numkMGHzVs%-.
您可以使用LINQ:
var allowedChars = "0123456789numkMGHzVs";
var result = String.Join("", input.Where(c => allowedChars.Any(x => x == c)));
另一种选择:
var result = String.Join("", str.Where(c => allowedChars.Contains(c)));
您可以将String.Concat
+Enumerable.Where
与HashSet<T>.Contains
:一起使用
HashSet<char> AllowedChars = new HashSet<char>("0123456789numkMGHzVs%-.");
private string RemoveUnwantedChar(string input)
{
return string.Concat(input.Where(AllowedChars.Contains));
}
以下是使用StringBuilder
和HashSet<T>
:的另一种有效方法
HashSet<char> AllowedChars = new HashSet<char>("0123456789numkMGHzVs%-.");
private string RemoveUnwantedChar(string input)
{
StringBuilder sb = new StringBuilder(input.Length);
foreach (char c in input)
if (AllowedChars.Contains(c))
sb.Append(c);
return sb.ToString();
}
您可以这样做:
// create a lookup hashset
private static HashSet<char> _allowedChars = new HashSet<char>("0123456789numkMGHzVs%-.".ToArray());
private string FilterString(string str)
{
// tempbuffer
char[] buffer = new char[str.Length];
int index = 0;
// check each character
foreach (var ch in str)
if (_allowedChars.Contains(ch))
buffer[index++] = ch;
// return the new string.
return new String(buffer, 0, index);
}
因此,诀窍是创建一个哈希集来验证每个字符。正如你所说,"混乱"的方式是创建新的字符串,并会破坏记忆。还要尽量避免使用许多嵌套的if
语句。(就像你想避免的那样)
如果你喜欢linq,你可以做一些类似的事情:
// create a lookup hashset
private static HashSet<char> _allowedChars = new HashSet<char>("0123456789numkMGHzVs%-.".ToArray());
private string FilterString2(string str)
{
return new String(
str.Where(ch => _allowedChars.Contains(ch)).ToArray());
}
但这会降低它的可读性。。
如果您使用LINQ,您可以执行以下操作:
char[] validChars = "0123456789numkMGHzVs%-.".ToArray();
var newString = "Teststring012";
string filtered = string.Join("", newString.Where(x => validChars.Contains(x)));
我喜欢这个清晰可读的Regex解决方案。
public string RemoveUnwantedChar(string input) {
return Regex.Replace(input, "[^0-9numkMGHzVs%''-.]", "");
}