1

これは私の文字列値です:

string str = "32 ab d32";

そして、このリストは私の許可された文字です:

var allowedCharacters = new List<string> { "a", "b", "c", "2", " " };

私はそれを次のようにしたいと思います:

str == " 2 ab   2";

許可された文字リストにない文字を空のスペースに置き換えたいのですが。

4

5 に答える 5

5

正規表現なし:

IEnumerable<Char> allowed = srVariable
    .Select(c => lstAllowedCharacters.Contains(c.ToString()) ? c : ' ');
string result = new string(allowed.ToArray());
于 2012-12-11T16:48:16.327 に答える
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);
于 2012-12-11T16:49:07.890 に答える
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()
);
于 2012-12-11T16:51:38.573 に答える
1

String.Replaceを使用してみませんか?

于 2012-12-11T16:49:04.193 に答える
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();
于 2012-12-11T16:58:21.113 に答える