12

誰かが私に文字列を検証するための正規表現を提供できますか?バックスラッシュ以外の特殊文字のみを許可するべきではありません。私は試した

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$");

しかし、それは機能していないようです

4

3 に答える 3

28

バックスラッシュは、正規表現でエスケープする必要があります。逐語的な文字列リテラルを使用しない限り、C# でもエスケープする必要があります。したがって、これらのいずれかが機能するはずです。

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$");
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$");

これらはどちらも、次の文字列コンテンツがRegexコンストラクターに渡されることを保証します。

^[a-zA-Z0-9\\ ]*$

次に、Regexコードは二重のバックスラッシュを認識し、「バックスラッシュ文字を本当に一致させたい」として扱います。

基本的に、「正規表現エンジンに渡したい文字列の内容」と「ソースコードの文字列リテラル表現」を常に区別する必要があります。(もちろん、これは正規表現だけに当てはまるわけではありません。デバッガーは、ウォッチ ウィンドウなどでエスケープしても役に立ちません。)

編集: 質問が編集されて、元々3 つのバックスラッシュがあったことが示されましたが、これは有効な C# ではありません。次のいずれかである「3つのバックスラッシュを含む文字列」を目指していたと思われます。

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$");
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$");

...しかし、正規表現に関する限り、スペースをエスケープする必要はありません。

于 2013-02-01T07:07:47.060 に答える
11

あなたはそれをダブルエスケープする必要があります(C#の場合は1回、正規表現エンジンの場合は1回):

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$");

または、C#の逐語的な文字列機能を使用できます(@に注意してください)。

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$");

逐語的な文字列では、バックスラッシュはエスケープシーケンスの開始として解釈されないため、正規表現エンジンでは1回だけエスケープする必要があります。

現在のコードはコンパイルされないと思います。「認識されないエスケープシーケンス」に沿って何かを言う必要があります。
この理由は、3つの円記号の後にスペースが続くためです。最初の2つの円記号は、円記号を表すエスケープシーケンスとして解釈されますが、3番目の円記号は、2番目の文字としてスペースを使用してエスケープシーケンスを開始すると解釈されます。このようなエスケープシーケンスは存在しないため、エラーが発生します。

于 2013-02-01T07:06:34.237 に答える
0

単一のを照合するために4\を追加して、for regexとC#文字列をエスケープする必要があります。 \s\

于 2013-02-01T07:06:43.047 に答える