2015-09-29 41 views
6

Tôi đang cố giới hạn các mục nhập thành một định dạng cụ thể.Biểu thức chính quy có điều kiện của Javascript if-then-else

Nếu mục có 5500 hoặc 5100 như 01 \ 01-5500-000-00 sau đó tôi muốn có điều này:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-$ 

Nhưng nếu mục có bất cứ điều gì khác hơn là 5500 hoặc 5100 Tôi muốn có điều này:

^[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}$ 

Làm cách nào để hoàn thành ý tưởng nếu ý tưởng khác?

+4

Bạn đang sử dụng ngôn ngữ nào? Bạn đã thử cái gì? – Sam

+0

'^ [0-9] {2,} \\ [0-9] {2} -5 [15] 00- [0-9] {3} - $ |^[0-9] {2,} \\ [0-9] {2} - (?! 5 [15] 00) [0-9] {4} - [0-9] {3} - [0-9] {2} $ ' –

+0

I đã sử dụng http://www.webtoolkitonline.com/regular-expression-tester.html để giúp tôi tạo biểu thức chính xác. Và tôi đã thử sử dụng đường ống với 5500 trong ngoặc đơn như sau: (? =. * 5500) |^[0-9] {2,} \\ [0-9] {2} \ - [0-9] {4} \ - [0-9] {3} \ - [0-9] {2} $ - không chính xác – user974061

Trả lời

7

cú pháp regex có điều kiện không được hỗ trợ bởi động cơ regex JavaScript, nhưng nó có thể được làm việc xung quanh với một-chụp phi nhóm chứa 2 lựa chọn:

  1. Một cái nhìn tích cực hướng về phía trước và

  2. Thứ hai với hình ảnh đảo ngược, tiêu cực.

regex này đáp ứng tiêu chí của bạn và là JavaScript tương thích:

^(?:(?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-|(?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2})$ 

Xem regex demo

Hãy để tôi phá vỡ nó xuống:

  • ^ - Bắt đầu chuỗi
  • (?:
    • (?=.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\- - thay thế đầu tiên với các (?=.*\b5[15]00\b) nhìn về phía trước mà đòi hỏi toàn bộ một từ 5500 hoặc 5100 bên trong chuỗi, và các mô hình trước hết bạn phải
    • | - luân phiên điều hành
    • (?!.*\b5[15]00\b)[0-9]{2,}\\[0-9]{2}\-[0-9]{4}\-[0-9]{3}\-[0-9]{2}) - Thứ hai thay thế được thêm vào trước với (?!.*\b5[15]00\b) nhìn phía trước tiêu cực đảm bảo không có 5100 hoặc 5500 bên trong chuỗi và chỉ sau đó khớp với mẫu thứ hai của bạn.
  • $ - kết thúc chuỗi.
1

Sử dụng điều kiện, Ví dụ:

((= regex) sau đó | khác?): [0-9]{2,}\\[0-9]{2}\-(?(?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-[0-9]{3}\-[0-9]{2})

Regex điều kiện Ví dụ: [email protected]

Trong trường hợp bạn đang sử dụng một động cơ regex không dựa trên PCRE, bạn có thể bắt chước chức năng bằng cách thực hiện như sau:

((?=positive-regex-statement)then|(?!negavite-regex-statement)then) 

Ví dụ:

^[0-9]{2,}\\[0-9]{2}\-((?=5[15]00)[0-9]{4}\-[0-9]{3}\-|[0-9]{4}\-|(?!5[15]00)[0-9]{4}\-[0-9]{3}\-[0-9]{2})$ 

Mimic điều kiện regex dụ: [email protected]

+1

Điều này cho tôi một lỗi cú pháp – user974061

+2

@ user974061: Bạn có thể vui lòng cho biết ngôn ngữ lập trình mà bạn đang sử dụng với cụm từ thông dụng này không? (Các điều kiện chỉ được hỗ trợ bởi PCRE như động cơ). – Eder

+0

@Houseman: Bạn đã thực sự đọc toàn bộ bài đăng hay chỉ bình chọn không có lý do? Tôi đã cung cấp câu trả lời cho các công cụ không dựa trên PCRE (cũng bao gồm Javascript). – Eder

2

Thay thế phần này của mô hình [0-9]{4} với các giá trị văn chương cho 5100/5500:

/^\d{2,}\\\d{2}-(?:5[15]00-\d{3}-|(?!5[15]00)\d{4}-\d{3}-\d{2})$/ 
  • [0-9] là điều tương tự như \d trong JavaScript
  • Đối với phần khác, sử dụng negative lookahead(?!5[15]00)\d{4} để đảm bảo không phải là 5100/5500.
Các vấn đề liên quan