文字列が指定された場所でヘルプを探し、英数字のみの文字列を返し、英数字以外のすべての文字を _ に置き換えます
したがって、文字列「ASD@#$123」は「ASD___123」になります
等
ありがとう
ほとんどの文字列操作では、LINQ ではなく正規表現を使用した方が (効率と簡潔さの両方の点で) 優れています。
string input = "ASD@#$123";
string result = Regex.Replace(input, "[^A-Z0-9]", "_", RegexOptions.IgnoreCase);
などの非ASCII文字を含むUnicode英数字を保持したい場合はé
、非単語文字クラスを使用してさらに簡単にすることができます。
string input = "ASD@#$123";
string result = Regex.Replace(input, @"\W", "_");
比較のために、LINQ を使用して行われた同じ変換を次に示します (ASCII 文字と数字のみを許可します)。
string input = "ASD@#$123";
string result =
new string(input.Select(c =>
c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c >= '0' && c <= '9' ? c : '_'
).ToArray());
または、Char.IsLetterOrDigit
要件を満たしている場合:
string input = "ASD@#$123";
string result =
new string(input.Select(c => char.IsLetterOrDigit(c) ? c : '_').ToArray());
Char.IsLetterOrDigit
非ASCII文字を許可\w
し、2番目の例で否定が使用された単語文字クラスに相当することに注意してください。
編集:Steve Worthamが観察したように、LINQバージョンは実際には正規表現よりも3倍以上高速です(Regex
インスタンスを事前に作成してRegexOptions.Compiled
再利用した場合でも)。
char[] unwanted = new[] {'@', '#', '$'};
foreach(var x in query)
{
x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};
これがあなたのための機能です:
String ReplaceWrongChars(String baseString)
{
Regex rx = new Regex("[^A-Za-z0-9 ]", RegexOptions.CultureInvariant);
String rv = rx.Replace(baseString, "_");
return rv;
}
スペースが不要な場合は、「[^A-Za-z0-9]」を正規表現として使用してください。