如何使用RegEx替换字符串中所有不需要的字符?

问题描述:

在c#应用程序中,我需要用“Ô替换所有不需要的字符。以下是允许的字符数组。如何使用RegEx替换字符串中所有不需要的字符?

string[] wantedCharacters = new string[] { " ", "!", "\"", "#", "$", "%", "&", "\'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~" }; 

除此之外的所有字符都应该用“Ô替换。我已经用Loopin完成了所有的字符串。但是执行时间太长。我寻找一个正则表达式来做到这一点。 任何帮助将不胜感激。

+1

为什么你觉得正则表达式是不是通过每一个字符实际上循环更快? – 2013-02-22 06:38:03

[^c]意思是:所有不是c。你应该和你的性格不允许更换c和使用正则表达式替换方法:

var reg = new Regex(@"[^ !""#$%&'()*+,-./0-9:;<=>[email protected]\[\\\]^_`a-z{|}~]"); 
var result = reg.Replace(inputString, "Ã"); 

我不会使用RegEx,它的可读性会降低。

string input ".."; 
HashSet<char> wantedCharactersSet = new HashSet<char>(wantedCharacters); 
for (int i = 0; i < input.Length; i++) 
{ 
    if (!wantedCharactersSet.Contains(input[i])) 
     input[i] = placeholderChar; 
} 

请注意,HashSet<T>.Contains()具有性能O(1)而阵列只是n。

+1

我认为正则表达式是这个用例可以接受的答案,虽然我没有办法检查正则表达式对HashSet方法执行的速度有多快。 (对于OP的情况,HashSet并不需要)。 – nhahtdh 2013-02-22 06:46:37

+0

@nhahtdh:Hashset的性能将总是高于阵列 – abatishchev 2013-02-22 06:47:46

+0

@nhahtdh:如果性能确实重要,我怀疑RegEx是否更快。如果没关系,loop仍然更具可读性,imo。 – abatishchev 2013-02-22 06:48:57

看来您正试图将字符限制为ASCII中的可打印字符(代码为0x20至0x7E的字符)。所以,你可以使用这个表达式:

[^\x20-\x7E] 

正则表达式将匹配所有不需要字符。

把上述正则表达式中的文本字符串:

@"[^\x20-\x7E]" 

使用这个表达式与Replace功能,并与空字符串替换删除所有不必要的字符,或与您所选择的一些占位符代替。

+0

谢谢,这就是我正在寻找的 - +1 =) – 2013-10-03 17:04:27