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;
}

我想要的字符:0123456789numkMGHzVs%-.

C#从字符串中删除不需要的字符

您可以使用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.WhereHashSet<T>.Contains:一起使用

HashSet<char> AllowedChars = new HashSet<char>("0123456789numkMGHzVs%-.");
private string RemoveUnwantedChar(string input)
{
    return string.Concat(input.Where(AllowedChars.Contains));
}

以下是使用StringBuilderHashSet<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%''-.]", "");
}