2009-03-24 34 views
13

Tôi cần cụm từ thông dụng khớp với mẫu hoặc trống.Cụm từ thông dụng nào sẽ khớp với một mẫu hoặc để trống?

Ngay bây giờ tôi có một biểu ...

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

... mà phù hợp với các số điện thoại Mỹ. Tuy nhiên, nó hợp lệ cho chuỗi mà tôi đang thử nghiệm để trống. Nếu chuỗi có bất kỳ giá trị nào trong nó, nó phải khớp với biểu thức.

Tôi có các mẫu khác khớp với mã bưu điện của Hoa Kỳ, v.v ... cần có điều kiện tương tự.

Cách tốt nhất để đạt được điều này trong cùng một biểu thức là gì?

Làm rõ: Tôi đang sử dụng RegexValidator trong Khối xác thực ứng dụng từ Microsoft. Một ví dụ về việc sử dụng điều này như sau:

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

Đây là lý do tại sao tôi cần giải pháp được thể hiện trong một biểu thức.

+0

Có gì/x ở cuối regex của bạn? Trong Perl hoặc PHP, nó có nghĩa là chế độ giãn cách tự do, nhưng .NET không sử dụng cú pháp đó. –

+0

Ah .. không biết thực sự. Tôi vừa mới nhấc nó lên một nơi nào đó. Tôi sẽ gỡ bỏ nó và xem nó có giúp ích gì không. –

Trả lời

29

Quấn toàn bộ regex bằng cách bỏ và đặt? ở cuối:

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

hoạt động như một sự quyến rũ. tôi biết nó sẽ là một cái gì đó đơn giản như thế này. :) –

+2

thực sự ... điều này không hoạt động đúng. dấu chấm hỏi xuất hiện để làm cho regex quá tha thứ. Ví dụ: 555-1234 giờ sẽ khớp nhưng không được. –

+0

Giả sử regex ban đầu của bạn hoạt động, bạn có thể thử: \ B | \\ (? \ D {3} \\)? [- \ s.]? \ D {3} [- \ s.] \ D {4 }/x Nên là "chuỗi rỗng" HOẶC regex của bạn –

1

Hãy thử gói regex của bạn bằng (?:<your_regex>)?.

1

Hãy thử điều này:

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

Phần (?(1)\)|[-\s.]) là một cấu trúc có điều kiện. Nó nói "Nếu có một '(' ngay từ đầu (mà chúng ta biết bởi vì nhóm số 1 khớp với một cái gì đó), khớp với dấu ')' ở đây; nếu không thì khớp với dấu nối, khoảng trống hoặc dấu chấm." Và gói toàn bộ điều trong (?:...)? cho phép nó khớp với một chuỗi rỗng, giống như Kevin đã nói; nếu điều đó không hiệu quả với bạn, bạn phải đặt sai chỗ một trong số các parens (hoặc có thể một trong các dấu gạch chéo ngược).

Tôi đã thêm ^$ neo cho mục đích thử nghiệm; trong một kiểm soát validator họ không cần thiết.

+0

Thật kỳ lạ, regex của bạn hoàn toàn đổ vỡ trang web kiểm tra thể hiện tôi đã sử dụng (http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp).Tuy nhiên, +1 vì ý tưởng chung hoạt động. –

+0

Bạn có biết trang web đó sử dụng công cụ .NET regex không? Nó hoạt động tốt ở đây: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx –

Các vấn đề liên quan