2012-04-10 23 views
24

Tôi cố gắng để kết hợp 2 biểu thức thông thường thành 1 với toán tử OR: |Sử dụng Regex toán tử OR để giải quyết 2 điều kiện

tôi có một để kiểm tra cho phù hợp với một bức thư tiếp theo 8 chữ số:

Regex.IsMatch(s, "^[A-Z]\d{8}$") 


tôi có một để kiểm tra cho đơn giản 9 chữ số:

Regex.IsMatch(s, "^\d{9}$") 


Bây giờ, thay vì thực hiện:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}$") AndAlso 
    Not Regex.IsMatch(s, "^\d{9}$") Then 
    ... 
End If 


tôi nghĩ tôi chỉ có thể làm:

If Not Regex.IsMatch(s, "^[A-Z]\d{8}|\d{9}$") Then 
    ... 
End If 


Rõ ràng tôi không kết hợp hai cách chính xác và rõ ràng tôi khủng khiếp tại biểu thức thông thường. Bất kì sự trợ giúp nào đều được đánh giá cao.

Và đối với những người tự hỏi, tôi đã xem qua How to combine 2 conditions and more in regex và tôi vẫn đang gãi đầu.

+0

một cách khác để viết nó sẽ là '"^[A-Z0-9] \ d {8} $ "' (một chữ hoa hoặc số được theo sau bởi 8 số). Tuy nhiên, tôi không thấy vấn đề gì với regex của bạn. Bạn có thể cung cấp một số ví dụ về các chuỗi nên/không khớp không? –

+0

@PatrickMcElhaney Các mục nhập hợp lệ sẽ là: A1234578 HOẶC 123456789 –

+0

@ Đề xuất của Patrick Patrick hỗ trợ cả hai, cũng như câu trả lời của Mike C dưới đây với cùng một regex. –

Trả lời

30

Làm thế nào để sử dụng ^[A-Z0-9]\d{8}$?

+0

+1, hiệu quả hơn các thiết bị khác. – Griffin

+4

Cảm ơn bạn rất nhiều. Tôi không thể tin rằng tôi đã không thử điều đó trong thời gian của tôi. Regex khiến tôi mệt mỏi khi tôi bắt đầu nghĩ về nó, lol. –

11

Tôi nghĩ rằng bạn muốn nhóm các điều kiện:

Regex.IsMatch(s, "^(([A-Z]\d{8})|(\d{9}))$") 

Các^và $ đại diện cho sự khởi đầu và kết thúc của dòng, do đó bạn không muốn họ xem xét trong hay điều kiện. Các parens cho phép bạn rõ ràng về "mọi thứ trong paren này" hoặc "bất kỳ thứ gì trong paren khác"

+0

Chắc chắn, không có vấn đề –

5

Tôi tìm thấy nhà điều hành OR đôi khi hơi lạ, tôi sử dụng nhóm nào để biểu thị phần nào tôi muốn để khớp, vì vậy regex của bạn sẽ trở thành một cái gì đó như vậy: ^(([A-Z]\d{8})|(\d{9}))$

+0

@Scott: Cảm ơn bạn đã tip. Tôi đã cập nhật câu trả lời tôi đã đưa ra. – npinti

48

Toán tử | có mức ưu tiên cao và trong regex gốc của bạn sẽ được áp dụng trước tiên. Bạn nên kết hợp hai cặp dấu ngoặc/nhóm của regex để làm cho ưu tiên rõ ràng. Như trong:

"^(([A-Z]\d{8})|(\d{9}))$" 
+0

Chỉ cần tò mò về ngữ nghĩa của câu lệnh của bạn: bạn không đếm các dấu ngoặc đơn nhóm như "toán tử"? Nếu không, chúng là gì? "xây dựng" s? –

+0

Vâng, vâng, bạn chính xác - Tôi đang không chính xác với ngôn ngữ của tôi. Đó là một thói quen giải thích nó cho mọi người - họ tự nhiên chấp nhận rằng các dấu ngoặc đơn nhóm đè lên thứ tự ưu tiên và sau đó suy nghĩ về tất cả các toán tử khác sau đó. Nhưng nó là tốt để được chính xác, vì vậy tôi sẽ làm rõ. –

+0

@CodeJockey Tôi đã xem xét viết nhiều hơn, nhưng câu trả lời của bạn cung cấp một bản tóm tắt tuyệt vời về trường hợp này, và không cần phải lặp lại nó. Toán tử –

9

@ chào MikeC dường như là tốt nhất:

^[A-Z0-9]\d{8}$ 

... nhưng là tại sao biểu hiện của bạn không làm việc theo cách bạn mong đợi, bạn phải hiểu rằng | " hoặc nhà điều hành "hoặc" luân phiên "có ưu tiên rất cao - chỉ cao hơn một là cấu trúc nhóm, tôi tin. Nếu bạn sử dụng ví dụ của mình:

^[A-Z]\d{8}|\d{9}$ 

...về cơ bản bạn nói "khớp bắt đầu chuỗi, chữ hoa, sau đó 8 chữ số HOẶC khớp 9 chữ số rồi kết thúc chuỗi" - nếu, thay vào đó bạn có nghĩa là "bắt đầu chuỗi, sau đó là chữ cái viết hoa, sau 8 chữ số của chuỗi HOẶC đầu của chuỗi tiếp theo 9 chữ số, sau đó kết thúc chuỗi", sau đó bạn muốn một trong những:

^([A-Z]\d{8}|\d{9})$ 
^[A-Z]\d{8}$|^\d{9}$ 

Hy vọng điều này là hữu ích cho sự hiểu biết của bạn

+0

Tôi thực sự đã thử '^ [A-Z] \ d {8} $ |^\ d {9} $' tại http://regexpal.com/ trước khi đăng, nhưng nó không hiệu quả với tôi. Thật kỳ lạ, tôi đã quay lại và thử lại lần nữa, và bây giờ nó đã xảy ra. Tuy nhiên, câu trả lời của MikeC thực hiện chính xác điều tương tự mà không cần đến OR. Vì vậy, với tôi là trường hợp tốt nhất. 1 cho nỗ lực và giải thích mặc dù. –

+0

@Scott vui lòng trợ giúp :) –

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