2012-12-11 207 views

回答

2

正則表達式?正則表達式對於你想要完成的事情可能是過度的。

這裏有沒有正則表達式的另一種變體(修改您的lstAllowedCharacters實際上是字符的枚舉而不是字符串[作爲變量顧名思義]):

String original = "32 ab d32"; 
Char replacementChar = ' '; 
IEnumerable<Char> allowedChars = new[]{ 'a', 'b', 'c', '2', ' ' }; 

String result = new String(
    original.Select(x => !allowedChars.Contains(x) ? replacementChar : x).ToArray() 
); 
+0

謝謝。是你的還是@Tim Schmelter的更好? – MonsterMMORPG

+0

@MonsterMMORPG:取決於實施。字符串列表可能會失敗(因爲即使字符串被接受,Tim's實際上也只是比較字符 - 字符)。他們都這樣做,我只是把它比較明確。 –

5

沒有正則表達式:

IEnumerable<Char> allowed = srVariable 
    .Select(c => lstAllowedCharacters.Contains(c.ToString()) ? c : ' '); 
string result = new string(allowed.ToArray()); 
+0

是很好的解決方案 – MonsterMMORPG

2

試試這個:

string srVariable = "32 ab d32"; 
List<string> lstAllowedCharacters = new List<string> { "a", "b", "c", "2", " " }; 

srVariable = Regex.Replace(srVariable, "[^" + Regex.Escape(string.Join("", lstAllowedCharacters) + "]"), delegate(Match m) 
{ 
    if (!m.Success) { return m.Value; } 
    return " "; 
}); 

Console.WriteLine(srVariable); 
+0

都能跟得上我希望它替換字符無法在預定義列表中未將它們定義爲英語新howed。 – MonsterMMORPG

+0

但是,我已經調整了我的答案,注意模式中否定'^'字符。結果確實會返回你要求的「2 ab 2」。 –

+0

可能要在插入到正則表達式之前調用['Regex.Escape()'](http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.escape.aspx) 。更換'呼叫以避免任何無效字符。導致:'Regex.Replace(srVariable,String.Format(「[^ {0}]」,Regex.Escape(String.Join(String.Empty,lstAllowedCharacters))))' –

1

下面是一個簡單而高性能的foreach的解決方案:

Hashset<char> lstAllowedCharacters = new Hashset<char>{'a','b','c','2',' '}; 

var resultStrBuilder = new StringBuilder(srVariable.Length); 

foreach (char c in srVariable) 
{ 
    if (lstAllowedCharacters.Contains(c)) 
    { 
     resultStrBuilder.Append(c); 
    } 
    else 
    { 
     resultStrBuilder.Append(" "); 
    } 
} 

srVariable = resultStrBuilder.ToString(); 
相關問題