web-dev-qa-db-ja.com

ダッシュ以外のすべての英数字以外の文字を文字列から削除する方法を教えてください。

ダッシュとスペース以外のすべての英数字以外の文字を文字列から削除する方法を教えてください。

529
Luke101

[^a-zA-Z0-9 -]を空の文字列に置き換えます。

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
str = rgx.Replace(str, "");
765
Amarghosh

私はRegExを使ったかもしれません、彼らは洗練された解決策を提供することができますが、彼らはパフォーマンス上の問題を引き起こすことができます。これが一つの解決策です

char[] arr = str.ToCharArray();

arr = Array.FindAll<char>(arr, (c => (char.IsLetterOrDigit(c) 
                                  || char.IsWhiteSpace(c) 
                                  || c == '-')));
str = new string(arr);

コンパクトフレームワーク(FindAllを持たない)を使うとき

FindAllをに置き換えます。1

char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || 
                             char.IsWhiteSpace(c) || 
                             c == '-')).ToArray(); 

str = new string(arr);

1 ShawnFeatherlyによるコメント

332
ata

あなたが試すことができます:

   string s1= Regex.Replace(s,"[^A-Za-z0-9 _]","");

sはあなたの文字列です。

42
josephj1989

System.Linqを使う

string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());
33
Zain Ali

正規表現は[^\w\s\-]*です。

テキストの中にタブがあるかもしれないので、\sはspace()の代わりに使うほうが良いです。

21
True Soft

この質問に対する答えに基づいて、静的クラスを作成して追加しました。それは何人かの人々にとって役に立つかもしれないと思った。

public static class RegexConvert
{
    public static string ToAlphaNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z0-9]");
        return rgx.Replace(input, "");
    }

    public static string ToAlphaOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z]");
        return rgx.Replace(input, "");
    }

    public static string ToNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^0-9]");
        return rgx.Replace(input, "");
    }
}

その後、メソッドは次のように使用できます。

string example = "asdf1234!@#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();
12
Ppp

私は最初の問題であった Control の文字を削除することによって、別の解決策を作りました。

すべての「特別だが良い」文字をリストに入れるよりも優れています。

char[] arr = str.Where(c => !char.IsControl(c)).ToArray();    
str = new string(arr);

それはより簡単です、それで私はそれがより良いと思います!

4
Pinello

早く何かしたいですか?

public static class StringExtensions 
{
    public static string ToAlphaNumeric(this string self, params char[] allowedCharacters)
    {
        return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || allowedCharacters.Contains(c)));
    }
}

これにより、どの文字を許可するのかも指定できます。

3

これが私が探していたものでした非正規表現ヒープ割り当てフレンドリーな高速ソリューションです。

安全でない版.

public static unsafe void ToAlphaNumeric(ref string input)
{
    fixed (char* p = input)
    {
        int offset = 0;
        for (int i = 0; i < input.Length; i++)
        {
            if (char.IsLetterOrDigit(p[i]))
            {
                p[offset] = input[i];
                offset++;
            }
        }
        ((int*)p)[-1] = offset; // Changes the length of the string
        p[offset] = '\0';
    }
}

安全ではない、または文字列長のハックを信頼したくないという人のために。

public static string ToAlphaNumeric(string input)
{
    int j = 0;
    char[] newCharArr = new char[input.Length];

    for (int i = 0; i < input.Length; i++)
    {
        if (char.IsLetterOrDigit(input[i]))
        {
            newCharArr[j] = input[i];
            j++;
        }
    }

    Array.Resize(ref newCharArr, j);

    return new string(newCharArr);
}
2
BjarkeCK

これは @ata answerをインスピレーションとして使用した拡張方法です。

"hello-world123, 456".MakeAlphaNumeric(new char[]{'-'});// yields "hello-world123456"

またはハイフン以外の追加の文字が必要な場合は...

"hello-world123, 456!?".MakeAlphaNumeric(new char[]{'-','!'});// yields "hello-world123456!"


public static class StringExtensions
{   
    public static string MakeAlphaNumeric(this string input, params char[] exceptions)
    {
        var charArray = input.ToCharArray();
        var alphaNumeric = Array.FindAll<char>(charArray, (c => char.IsLetterOrDigit(c)|| exceptions?.Contains(c) == true));
        return new string(alphaNumeric);
    }
}
1
Aaron Hudon

私はここで答えの一つのバリエーションを使います。スペースを " - "に置き換えたいので、SEOに優しく、また小文字にします。また、私のサービス層からsystem.webを参照しないでください。

private string MakeUrlString(string input)
{
    var array = input.ToCharArray();

    array = Array.FindAll<char>(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-');

    var newString = new string(array).Replace(" ", "-").ToLower();
    return newString;
}
1
Philip Johnson