2013-04-13 29 views
28

Hãy nói tôi cóHOẶC tình trạng Regex

1 ABC Street 
1 A ABC Street 

Với \d, nó phù hợp với (những gì tôi mong đợi), với \d \w, nó phù hợp với 1 Một (dự kiến). Bây giờ tôi kết hợp mẫu với nhau \d|\d \w, nó chỉ khớp với mẫu đầu tiên nhưng bỏ qua mẫu thứ hai.

Câu hỏi của tôi là cách sử dụng hoặc điều kiện chính xác trong trường hợp cụ thể này?

PS: Điều kiện chỉ bao gồm số khi không có chữ cái nào sau đó, nếu không thì hãy quấn số và chữ cái đơn.

Ví dụ: 1 ABC đường trận đấu số 1 mà thôi, nhưng khi 1 Một đường ABC quấn 1 Một

+4

Bạn không nhất thiết phải sử dụng '|', ví dụ: '\ d (\ w)? ' –

+0

\ d (\ w)? phải giải câu đố của bạn. – HopeNick

Trả lời

38

Hãy thử

\d \w |\d 

hoặc thêm một lookahead tích cực nếu bạn không muốn bao gồm các không gian dấu trong trận đấu

\d \w(?=)|\d 

Khi bạn có hai lựa chọn thay thế nơi một là phần mở rộng của cái kia, đặt cái còn lại trước, nếu không thì sẽ không có cơ hội khớp.

16

Một cổ điển "hay" sẽ là |. Ví dụ: ab|de sẽ khớp với một trong hai bên của biểu thức.

Tuy nhiên, đối với trường hợp của bạn, bạn có thể muốn sử dụng số phân tích ?, sẽ khớp với biểu thức trước chính xác 0 hoặc 1 lần (ưu tiên 1 lần; tức là kết hợp "tham lam"). Một (có lẽ relyable hơn) thay thế sẽ được sử dụng một nhóm nhân vật tùy chỉnh:

\d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+ 

mô hình này sẽ phù hợp:

  • \d+: Một hoặc nhiều số.
  • \s+: Một hoặc nhiều khoảng trắng.
  • [A-Z\s]+: Một hoặc nhiều ký tự viết hoa hoặc ký tự khoảng trắng
  • \s+: Một hoặc nhiều khoảng trắng.
  • [A-Z][A-Za-z\s]+: Ký tự viết hoa được theo sau bởi ít nhất một ký tự (chữ hoa hoặc chữ thường) hoặc khoảng trắng.

Nếu bạn muốn kiểm tra tĩnh hơn, ví dụ:thực sự chỉ phù hợp ABCA ABC, sau đó bạn có thể kết hợp một (không phù hợp) nhóm và xác định các giải pháp thay thế bên trong (để giới hạn phạm vi):

\d (?:ABC|A ABC) Street 

Hoặc thay thế khác sử dụng một lượng hóa:

\d (?:A)?ABC Street 
+0

Điều này có vẻ hơi ngớ ngẩn '\ s + [A-Z \ s] + \ s +' - tại sao bạn cần phải khớp không gian màu trắng ở ba vị trí riêng biệt? Chắc chắn hoặc là [AZ \ s] + 'hoặc' \ s + [AZ] + \ s + 'có ý nghĩa hơn ... –

+0

Hm, vâng, suy nghĩ về nó, nó hơi quá mức sau khi tôi gỡ bỏ" đầu tiên hoặc cuối cùng phải là chữ "yêu cầu. :) Chỉnh sửa ... hay không. Nó vẫn còn hữu ích, bởi vì theo cách đó, tôi buộc các dấu cách đầu/cuối trong khi cho phép các dấu ngoặc vuông khớp với nhiều từ. – Mario

+0

Chắc chắn đó là một trường hợp cho lookaround? –

8

Tôi nghĩ rằng những gì bạn cần có thể chỉ đơn giản là:

\d(\w)? 

Lưu ý rằng regex của bạn sẽ làm việc quá nếu nó được viết như \d \w|\d thay vì \d|\d \w.

Điều này là do trong trường hợp của bạn, khi regex khớp với tùy chọn đầu tiên, \d, nó ngừng tìm kiếm một kết quả mới, để nói.

+2

Tôi upvote cho cuộc khám phá của bạn !!! –

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