4

文字列が指定された場所でヘルプを探し、英数字のみの文字列を返し、英数字以外のすべての文字を _ に置き換えます

したがって、文字列「ASD@#$123」は「ASD___123」になります

ありがとう

4

3 に答える 3

10

ほとんどの文字列操作では、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再利用した場合でも)。

于 2012-05-15T18:59:59.397 に答える
0
char[] unwanted = new[] {'@', '#', '$'};

foreach(var x in query)
{
    x.SomePropertyName = string.Join("_", x.SomePropertyName.Split(unwanted));
};

文字列内の複数の文字を置き換えるLINQラムダ式

于 2012-05-15T19:05:47.660 に答える
0

これがあなたのための機能です:

    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]」を正規表現として使用してください。

于 2012-05-15T19:10:38.420 に答える