2009-03-24 9 views
13

パターンに一致するか、空の正規表現が必要です。パターンにマッチしたり、空の正規表現はありますか?

今私が式を持っている...米国の電話番号と一致する

"\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x" 

...。ただし、テストしている文字列が空であることは有効です。文字列に値がまったく入っていない場合は、式と一致する必要があります。

米国の郵便番号などに一致する他のパターンがあり、同じ条件が必要です。

同じ表現でこれを達成する最良の方法は何ですか?

明確化:Microsoftの検証アプリケーションブロックでRegexValidatorを使用しています。これを使用する例は、次のとおりです。

[StringLengthValidator(0, 100, MessageTemplate = "Email must be between {3} and {5}")] 
[RegexValidator(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", MessageTemplate = "Valid Email Required.")] 
public string EmailAddress 
{ 
    get { return _EmailAddress; } 
    set { SetValue<string>(ref _EmailAddress, value); } 
} 

これは、ソリューションを1つの式にする必要がある理由です。

+0

正規表現の最後に/ xはありますか? PerlやPHPではフリースペースモードを意味しますが、.NETはその構文を使用しません。 –

+0

ああ..実際には分かりません。私はちょうどどこかの場所からそれを持ち上げた。私はそれを削除し、それが役立つかどうかを確認します。 –

答えて

29

正規表現全体を括弧で囲み、?最後:

(\(?\d{3}\)?[-\s.]?\d{3}[-\s.]\d{4}/x)? 
+0

は魅力的に働いた。私はそれがこのような単純なものであることを知っていた。 :) –

+2

実際には...これは正しく動作しません。末尾の疑問符は正規表現をあまりにも寛容にするように見えます。たとえば、555-1234は一致するようになりましたが、そうではありません。 –

+0

元の正規表現が動作していると仮定すると、 \ B | \\(?\ d {3} \\)?[ - \ s。]?\ d {3} [ - \ s。] \ d {4 }/x "空文字列"または正規表現 –

1

(?:<your_regex>)?で正規表現をラップしてみてください。

1

これを試してみてください:

@"^(?:(\()?\d{3}(?(1)\)|[-\s.])\d{3}[-\s.]\d{4})?$" 

(?(1)\)|[-\s.])部分は、条件付き構造です。 「最初に((グループ#1が何かにマッチしたことでわかっている)( ')」があれば、ここで') 'とマッチし、それ以外の場合はハイフン、空白またはドットにマッチします。 (?:...)?に全体をラップすると、空の文字列にマッチすることができます。それがあなたのために働かないならば、あなたは間違ったもの(またはバックスラッシュの1つ)のいずれかを間違って配置しなければなりません。

私は^$アンカーをテスト目的で追加しました。バリデータコントロールでは必要ないはずです。

+0

奇妙なことに、あなたの正規表現は、私が使ってきた表現チェックサイト(http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp)を完全にクラッシュさせます。しかし、一般的な考えが働くので+1。 –

+0

そのサイトが.NET regexエンジンを使用しているかどうか知っていますか?ここでうまくいく:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

関連する問題