C# string.replace的LINQ查询
如果给定任何字符串,请查找帮助,返回仅包含字母数字字符的字符串,并将所有非字母数字字符替换为_ 所以串 “ASD#123美元”成为 “ASD_____123” 等C# string.replace的LINQ查询,c#,.net,linq,C#,.net,Linq,如果给定任何字符串,请查找帮助,返回仅包含字母数字字符的字符串,并将所有非字母数字字符替换为_ 所以串 “ASD#123美元”成为 “ASD_____123” 等 感谢大多数字符串操作,如果您使用正则表达式而不是LINQ,您的情况会更好(在效率和简洁性方面): string input = "ASD@#$123"; string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase); 如果要保留任何Un
感谢大多数字符串操作,如果您使用正则表达式而不是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字母和数字):
请注意,Char.isleterOrdigit
将允许使用非ASCII字母,这与第二个示例中使用否定的\w
word字符类相当
Edit:正如Steve Wortham所观察到的,LINQ版本实际上比正则表达式快3倍多(即使使用regexRegexOptions.Compiled
预先创建了regex
实例并重新使用)
以下是为您提供的功能:
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]”作为正则表达式。返回txt.Where(Char.isleterOrdigit).ToArray()收缩字符串,但仍在考虑如何替换它们:)例如,Ö
或α
的可能重复字符是字母数字字符:)@L.B:因为这是一个编校操作,更合理的假设是不允许使用非ASCII字符(尽管我在最后对此做了说明)。@L.B:为了清楚起见,我添加了另一个保留Unicode字母的示例。+1。尽管我必须注意,尽管您的第一个正则表达式解决方案很简洁,但它比您的Linq解决方案慢3倍多。启用RegexOptions有些帮助。编译,但Linq仍然很容易赢得比赛。@SteveWortham:奇怪……让我来测试一下。
string input = "ASD@#$123";
string result =
new string(input.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
char[] unwanted = new[] {'@', '#', '$'};
foreach(var x in query)
{
x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};
String ReplaceWrongChars(String baseString)
{
Regex rx = new Regex("[^A-Za-z0-9 ]", RegexOptions.CultureInvariant);
String rv = rx.Replace(baseString, "_");
return rv;
}