2009-03-24 23 views
13

Potrzebuję wyrażenie regularne pasujące do wzorca lub jest puste.Jakie wyrażenie regularne będzie pasowało do wzorca lub będzie puste?

Teraz mam wyrażenie ...

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

... które pasuje US numerów telefonów. Jednak jest ważne, aby ciąg, który testuję, był pusty. Jeśli łańcuch ma jakąkolwiek wartość, musi być zgodny z wyrażeniem.

Mam inne wzory, które pasują do amerykańskich kodów pocztowych itp., Które wymagają tego samego warunku.

Jaki jest najlepszy sposób osiągnięcia tego w tym samym wyrażeniu?

Wyjaśnienie: Używam RegexValidator w bloku Application Validation Block firmy Microsoft. Przykładem wykorzystania tego jest następujący:

[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); } 
} 

Dlatego muszę rozwiązanie będzie w jednej wypowiedzi.

+0

Co oznacza/x na końcu wyrażenia regularnego? W Perlu lub PHP oznaczałoby to tryb wolnego odstępu, ale .NET nie używa tej składni. –

+0

Ah .. nie wiem właściwie. Właśnie zdjąłem to z jakiegoś serwisu. Usuwam to i zobaczę, czy to pomaga. –

Odpowiedz

29

Zawiń całe wyrażenie w parens i umieść? Na koniec:

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

pracował jak urok. wiedziałem, że to będzie coś prostego. :) –

+2

właściwie ... to nie działa poprawnie. pojawiający się znak zapytania sprawia, że ​​regex jest zbyt wyrozumiały. Na przykład 555-1234 będzie teraz zgodne, ale nie powinno. –

+0

Zakładając, że działa oryginalne wyrażenie regularne, możesz wypróbować: \ B | \\ (? \ D {3} \\)? [- \ s.]? \ D {3} [- \ s.] \ D {4 }/x Który powinien być "pusty ciąg" LUB Twój regex –

1

Spróbuj owijając swój regex z (?:<your_regex>)?.

1

Spróbuj tego:

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

(?(1)\)|[-\s.]) część jest uwarunkowane konstrukcją. Mówi "Jeśli było" ("na początku (co wiemy, ponieważ grupa nr 1 pasuje do czegoś), dopasuj") "tutaj, w przeciwnym razie dopasuj łącznik, spację lub kropkę." I owijając całość w (?:...)? pozwala dopasować pusty ciąg, tak jak powiedział Kevin; jeśli to nie zadziałało dla ciebie, musiałeś zgubić jedną z paren (lub może jedną z odskoków).

Dodałem kotwice ^ i $ do celów testowych; w kontrolce walidatora nie powinny być potrzebne.

+0

Co ciekawe, twoje regex całkowicie zawiesza stronę sprawdzającą ekspresję, której używam (http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp).Jednak +1, ponieważ ogólny pomysł działa. –

+0

Czy wiesz, czy ta witryna używa mechanizmu regex .NET? Działa to dobrze tutaj: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

Powiązane problemy