6

英数字のみに加えて、アンダースコア、ピリオド、マイナス (ダッシュ) 文字など、いくつかの文字を許可する文字列の「クリーンアップ」関数を作成しようとしています。

現在、私たちの関数はソース文字列のまっすぐな char 反復を使用していますが、これを RegEx に変換しようとしています。有効な正規表現を取得するまでプロファイルできません。)

私にとって問題は 2 つあります。1つ、私は次の正規表現を知っています...

[a-zA-Z0-9]

...さまざまな英数字に一致しますが、アンダースコア、ピリオド、およびマイナス文字も含めるにはどうすればよいですか? それらを単に「\」文字でエスケープし、残りの括弧で囲みますか?

第 2 に、一致の一部ではない文字 (つまり、「?」などの他の句読点) については、アンダースコアに置き換えたいと考えています。

私の考えでは、代わりに、目的の文字の範囲で一致し、目的の範囲にない単一の文字で一致してから、それを置き換えます。そのための正規表現は、このように括弧間の最初の文字としてカラットを含めることだと思います...

[^a-zA-Z0-9]

それは正しいアプローチですか?

4

4 に答える 4

7

おそらくこれを行う最も効率的な方法は、置換する文字を記述する静的正規表現を設定することです。

public static class StringCleaner
{    
    public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

    public static string ReplaceInvalidChars(string input)
    {
        return invalidChars.Replace(input, "_");
    }
}

ただし、正規表現で行末と空白 (スペースやタブなど) を置き換えたくない場合は、少し異なる式を使用する必要があります。

public static Regex invalidChars = new Regex(@"[^A-Z0-9._\-\s]", RegexOptions.Compiled | RegexOptions.IgnoreCase);

また、リテラル文字と一致させるためにエスケープする必要があるもののルールは次のとおりです。

角括弧で示されるセット内では、これらの文字が出現-#]\する場所でエスケープする必要があり^、リテラル文字と一致するようにセットの最初の位置に表示される場合にのみエスケープする必要があります。セットの外では、これらの文字をエスケープする必要があります:.$^|{}[]()+?#リテラル文字と一致させるため。

詳細については、次のドキュメントを参照してください。

于 2013-07-09T17:42:40.777 に答える
3

不要な文字を削除しようとしている場合は、次の方法が適していますRegex.Replace

string cleaned = Regex.Replace(input, "[^a-zA-Z0-9_.]|-", "_");

「-」文字を含めるには、正規表現 OR を使用してその文字を含めることができますが、文字クラスに含める方法はおそらくありますが、現時点ではエスケープしています。

編集:とにかくクラスと一致しないため、実際にはハイフンを明示的に含める必要はありません。つまり、ハイフンをアンダースコアに置き換えたい場合は、[^a-zA-Z0-9_.]クラスとして使用するだけです...これらのクラスに一致しないものはすべて置き換えられます。ただし、クラスにハイフンを含める正しい方法は、バックスラッシュ ( \-) でエスケープするか、クラス リストの先頭に配置することです[^-a-zA-Z0-9_.]

于 2013-07-09T16:03:51.960 に答える