LINQ查询string.replace

时间:2012-05-15 18:58:09

标签: c# .net linq

在给定任何字符串的情况下寻找帮助,返回仅包含字母数字字符的字符串,并用_

替换所有非字母数字字符

如此字符串 “ASD @#$ 123”变成了 “ASD ___ 123”

感谢

3 个答案:

答案 0 :(得分:10)

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

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

如果要保留任何Unicode字母数字字符,包括é等非ASCII字母,我们可以使用non-word character类使其更简单:

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倍(即使事先用{{1}创建了Regex实例并重新使用)。

答案 1 :(得分:0)

char[] unwanted = new[] {'@', '#', '$'};

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

LINQ lambda expression to replace multiple characters in a string

答案 2 :(得分: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]”作为正则表达式。