4

在给定任何字符串的情况下寻求帮助,返回仅包含字母数字字符的字符串,并将所有非字母数字字符替换为 _

所以字符串“ASD@#$123”变成了“ASD___123”

ETC

谢谢

4

3 回答 3

10

对于大多数字符串操作,如果您使用正则表达式而不是 LINQ ,您会更好(在效率和简洁性方面):

string input = "ASD@#$123";
string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase);

如果您想保留任何 Unicode 字母数字字符,包括非 ASCII 字母,例如é,我们可以使用非单词字符类使其更简单:

string input = "ASD@#$123";
string result = Regex.Replace(input, @"\W", "_");

为了比较,这里是使用 LINQ 完成的相同转换(只允许 ASCII 字母和数字):

string input = "ASD@#$123";
string result =
    new string(input.Select(c => 
        c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' ? c : '_'
    ).ToArray());

或者,如果Char.IsLetterOrDigit满足您的要求:

string input = "ASD@#$123";
string result = 
    new string(input.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());

请注意,这Char.IsLetterOrDigit将允许非 ASCII 字母,并且与\w我们在第二个示例中使用否定的单词字符类相当。

编辑:正如 Steve Wortham 所观察到的,LINQ 版本实际上比正则表达式快 3 倍以上(即使Regex实例是预先创建并重RegexOptions.Compiled用的)。

于 2012-05-15T18:59:59.397 回答
0
char[] unwanted = new[] {'@', '#', '$'};

foreach(var x in query)
{
    x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};

LINQ lambda 表达式替换字符串中的多个字符

于 2012-05-15T19:05:47.660 回答
0

这是适合您的功能:

    String ReplaceWrongChars(String baseString)
    {
        Regex rx = new Regex("[^A-Za-z0-9 ]", RegexOptions.CultureInvariant);
        String rv = rx.Replace(baseString, "_");

        return rv;
    }

如果您不需要包含空格,请使用“[^A-Za-z0-9]”作为正则表达式。

于 2012-05-15T19:10:38.420 回答