web-dev-qa-db-ja.com

C#特殊文字を削除する

文字列からすべての特殊文字を削除したい。使用できる文字は、A〜Z(大文字または小文字)、数字(0〜9)、アンダースコア(_)、空白()、パーセント(%)、またはドット記号(。)です。

私はこれを試しました:

        StringBuilder sb = new StringBuilder();
        foreach (char c in input)
        {
            if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') | c == '.' || c == '_' || c == ' ' || c == '%')
            { sb.Append(c); }
        }
        return sb.ToString();

この:

        Regex r = new Regex("(?:[^a-z0-9% ]|(?<=['\"])s)", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled); 
        return r.Replace(input, String.Empty); 

しかし、何も機能していないようです。どんな助けでもありがたいです。

ありがとうございました!

16
OBL

最初の方法を次のように簡略化できます

StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
    if (Char.IsLetterOrDigit(c) || c == '.' || c == '_' || c == ' ' || c == '%')
    { sb.Append(c); }
}
return sb.ToString();

簡単なテストに合格したようです。 LINQを使用して短縮できます

return new string(
    input.Where(
        c => Char.IsLetterOrDigit(c) || 
            c == '.' || c == '_' || c == ' ' || c == '%')
    .ToArray());
15
Regex.Replace(input, "[^a-zA-Z0-9% ._]", string.Empty)

|の前に||の代わりにc == '.'(ビット単位のOR)があることを除いて、最初のアプローチは正しいようです。

ちなみに、whatが機能しない(コンパイルされない、クラッシュする、または間違った出力を生成する)と述べる必要があります。

6
StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
    if (char.IsLetterOrDigit(c) || "_ %.".Contains(c.ToString()))
        sb.Append(c);
}
return sb.ToString();
3
Jim Bolla

これは私のバージョンがどのように見えるかです。

StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
    if (Char.IsLetterOrDigit(c) ||
        c == '.' || c == '_' || c == ' ' || c == '%')
        sb.Append(c);
    }
}
return sb.ToString();
1
Jonathan Wood
private string RemoveReservedCharacters(string strValue)
{
    char[] ReservedChars = {'/', ':','*','?','"', '<', '>', '|'};

    foreach (char strChar in ReservedChars)
    {
        strValue = strValue.Replace(strChar.ToString(), "");
    }
    return strValue;
}
1
VicSinfuente

各文字をintにキャストし、そのASCIIコードをインターネット全体で見つけることができるASCIIテーブルと比較します。 http://www.asciitable.com/

    {
        char[] input = txtInput.Text.ToCharArray();
        StringBuilder sbResult = new StringBuilder();

        foreach (char c in input)
        {
            int asciiCode = (int)c;
            if (
                //Space
                asciiCode == 32
                ||
                // Period (.)
                asciiCode == 46
                ||
                // Percentage Sign (%)
                asciiCode == 37
                ||
                // Underscore
                asciiCode == 95
                ||
                ( //0-9, 
                    asciiCode >= 48
                    && asciiCode <= 57
                )
                ||
                ( //A-Z
                    asciiCode >= 65
                    && asciiCode <= 90
                )
                ||
                ( //a-z
                    asciiCode >= 97
                    && asciiCode <= 122
                )
            )
            {
                sbResult.Append(c);
            }
        }

        txtResult.Text = sbResult.ToString();
    }
1
essedbl