Bạn có thể có được một giải pháp mà không lặp lại bằng cách sử dụng backreferences và conditionals:
/^(")?(pattern)(?(1)\1|)$/
Matches:
Liệu không khớp:
mô hình này là hơi phức tạp, tuy nhiên. Đầu tiên nó tìm kiếm một dấu ngoặc kép tùy chọn, và đặt nó vào backreference 1 nếu một được tìm thấy. Sau đó, nó tìm kiếm mẫu của bạn. Sau đó, nó sử dụng cú pháp có điều kiện để nói "nếu backreference 1 được tìm thấy một lần nữa, phù hợp với nó, nếu không phù hợp với không có gì". Toàn bộ mẫu là anchored (có nghĩa là nó cần tự xuất hiện trên một dòng) sao cho các dấu ngoặc kép không khớp sẽ không bị bắt (nếu không thì pattern
trong pattern"
sẽ khớp).
Lưu ý rằng hỗ trợ cho điều kiện thay đổi theo công cụ và biểu thức dài dòng hơn nhưng lặp đi lặp lại sẽ được hỗ trợ rộng rãi hơn (và dễ hiểu hơn).
Cập nhật: Một phiên bản đơn giản hơn nhiều của regex này sẽ /^(")?(pattern)\1$/
, mà không cần một điều kiện. Khi tôi đã thử nghiệm này ban đầu, người thử nghiệm tôi đã sử dụng đã cho tôi một âm tính giả, dẫn tôi đến giảm giá nó (oops!).
Tôi sẽ để lại giải pháp với điều kiện cho hậu thế và sự quan tâm, nhưng đây là phiên bản đơn giản hơn có nhiều khả năng hoạt động trong nhiều loại động cơ hơn (backreferences là tính năng duy nhất được sử dụng tại đây có thể không được hỗ trợ).
Nguồn
2010-08-25 18:23:52
gì hương vị của regex bạn đang sử dụng? .Net cho phép loại "kết hợp ngoặc đơn" nhưng các hương vị khác thì không. – cristobalito
Một khám phá có liên quan: http://stackoverflow.com/questions/3165755/capturing-thispartonly-and-thispartonly-with-the-same-group – polygenelubricants