Reputation: 23830
This is my string value:
string str = "32 ab d32";
And this list is my allowed characters:
var allowedCharacters = new List<string> { "a", "b", "c", "2", " " };
I want it to become:
str == " 2 ab 2";
I would like to replace any character that is not in the allowed character list, with an empty space.
Upvotes: 1
Views: 4333
Reputation: 7759
Try this:
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);
Upvotes: 3
Reputation: 17855
Here is a simple but performant foreach solution:
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();
Upvotes: 1
Reputation: 101614
Regex? Regex may be overkill for what you're trying to accomplish.
Here's another variation without regex (modified your lstAllowedCharacters
to actually be an enumerable of characters and not strings [as the variable name implies]):
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()
);
Upvotes: 2
Reputation: 460138
Without regex:
IEnumerable<Char> allowed = srVariable
.Select(c => lstAllowedCharacters.Contains(c.ToString()) ? c : ' ');
string result = new string(allowed.ToArray());
Upvotes: 5