正则表达式删除字符串中的所有特殊字符?

我完全不会使用正则表达式,所以我需要一些帮助来解决一个问题,我认为最好使用正则表达式来解决这个问题。

我有 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之外的任何字符在我的情况下都是特殊的。

261754 次浏览

这个应该可以:

[^a-zA-Z0-9]

基本上它匹配所有非字母数字字符。

这实际上取决于你对特殊字符的定义。我发现在大多数情况下,白名单比黑名单更好:

tmp = Regex.Replace(n, "[^0-9a-zA-Z]+", "");

您应该谨慎使用当前的方法,因为以下两项将被转换为同一个字符串,因此将无法区分:

"TRA-12:123"
"TRA-121:23"

[^a-zA-Z0-9]是匹配任何非字母数字字符的字符类。

或者,[^\w\d]做同样的事情。

用法:

string regExp = "[^\w\d]";
string tmp = Regex.Replace(n, regExp, "");

根据您对“特殊字符”的定义,我认为“[ ^ a-zA-Z0-9]”可能会奏效。这样就可以找到任何不是小写字母、大写字母或数字的东西。

tmp = Regex.Replace(n, @"\W+", "");

\w匹配字母、数字和下划线,\W是否定的版本。

你可使用:

string regExp = "\\W";

这相当于丹尼尔的 [^a-zA-Z0-9]

W 匹配任何非单词字符。等效于 Unicode 类别 [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}]

出于我的目的,我想要所有的英文 ASCII 字符,所以这个工作。

html = Regex.Replace(html, "[^\x00-\x80]+", "")

如果您不想使用正则表达式,那么另一个选项是使用

char.IsLetterOrDigit

您可以使用它来遍历字符串的每个字符,并且只有在 true 时才返回。

public static string Letters(this string input)
{
return string.Concat(input.Where(x => char.IsLetter(x) && !char.IsSymbol(x) && !char.IsWhiteSpace(x)));
}