我完全无法使用正则表达式,因此我需要一些帮助来解决我认为最好通过使用正则表达式解决的问题。
我在C#中有字符串列表:
List<string> lstNames = new List<string>();
lstNames.add("TRA-94:23");
lstNames.add("TRA-42:101");
lstNames.add("TRA-109:AD");
foreach (string n in lstNames) {
// logic goes here that somehow uses regex to remove all special characters
string regExp = "NO_IDEA";
string tmp = Regex.Replace(n, regExp, "");
}
我需要能够遍历列表并返回每个项目而没有任何特殊字符。例如,第一项是“TRA9423”,第二项是“TRA42101”,第三项是TRA109AD。
是否有可以为我完成此操作的正则表达式?
此外,该列表包含超过4000个项目,因此我需要搜索和替换以尽可能高效和快速。
编辑: 我应该指定a-z,A-Z和0-9旁边的任何字符在我的情况下都是特殊的。
答案 0 :(得分:103)
这实际上取决于您对特殊字符的定义。我发现在大多数情况下,白名单而不是黑名单是最好的方法:
tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");
您应该小心当前的方法,因为以下两个项目将转换为相同的字符串,因此无法区分:
"TRA-12:123"
"TRA-121:23"
答案 1 :(得分:17)
[^a-zA-Z0-9]
是一个匹配任何非字母数字字符的字符类。
或者,[^\w\d]
做同样的事情。
用法:
string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");
答案 2 :(得分:16)
这应该这样做:
[^a-zA-Z0-9]
基本上它匹配所有非字母数字字符。
答案 3 :(得分:8)
您可以使用:
string regExp = "\\W";
这相当于丹尼尔的“[^a-zA-Z0-9]
”
\ W匹配任何非字符。相当于Unicode类别[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]
。
答案 4 :(得分:3)
根据你对“特殊字符”的定义,我认为“[^ a-zA-Z0-9]”可能会成功。那会找到任何不是小写字母,大写字母或数字的东西。
答案 5 :(得分:2)
tmp = Regex.Replace(n, @"\W+", "");
\w
匹配字母,数字和下划线,\W
是否定版本。
答案 6 :(得分:2)
出于我的目的,我想要所有的英文ASCII字符,所以这很有用。
html = Regex.Replace(html, "[^\x00-\x80]+", "")
答案 7 :(得分:0)
如果您不想使用Regex,则另一个选项是使用
char.IsLetterOrDigit
您可以使用它来循环遍历字符串的每个字符,并且只有在返回时才返回。
答案 8 :(得分:0)
public static string Letters(this string input)
{
return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}