2012-09-17 33 views
12

Đây là một chuỗi ví dụ:Làm cách nào để tôi thực hiện một phần của kết hợp regex tùy chọn?

123456#p654321 

Hiện nay, tôi đang sử dụng trận đấu này để nắm bắt 123456654321 vào hai nhóm khác nhau:

([0-9].*)#p([0-9].*) 

Nhưng vào những dịp, các #p654321 một phần của chuỗi sẽ không có ở đó, vì vậy tôi sẽ chỉ muốn nắm bắt nhóm đầu tiên. Tôi đã cố gắng để làm cho nhóm thứ hai "tùy chọn" bằng cách gắn thêm ? vào nó, hoạt động, nhưng chỉ miễn là có một số #p ở cuối chuỗi còn lại.

Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

33

Bạn có #p bên ngoài nhóm chụp, làm cho nó trở thành một phần yêu cầu của kết quả. Bạn cũng đang sử dụng ký tự dấu chấm (.) không đúng cách. Dot (trong hầu hết các biến thể reg-ex) sẽ khớp với bất kỳ ký tự nào. Thay đổi nó thành:

([0-9]*)(?:#p([0-9]*))? 

Cú pháp (?:) là cách bạn có được nhóm không chụp. Sau đó, chúng tôi chỉ chụp các chữ số mà bạn quan tâm. Cuối cùng, chúng tôi làm cho toàn bộ tùy chọn.

Ngoài ra, hầu hết các biến thể reg-ex đều có một lớp ký tự \d cho các chữ số. Vì vậy, bạn có thể đơn giản hóa hơn nữa:

(\d*)(?:#p(\d*))? 

Như một người khác đã chỉ ra, các nhà điều hành * khả năng có thể phù hợp với zero chữ số. Để ngăn chặn điều này, sử dụng toán tử + thay vì:

(\d+)(?:#p(\d+))? 
+0

tôi đã cố gắng mà trước đây, và nó hoạt động tuy nhiên nếu có một phần thứ hai vào chuỗi sau đó nhóm đầu tiên là toàn bộ chuỗi, và không có gì là trong nhóm thứ hai. – user1447941

+0

Dấu chấm trong reg-ex của bạn đang gây ra sự cố. Xem bản sửa đổi của tôi. –

+0

Và bây giờ nhóm thứ hai là '# p654321'. Nó có thể nhìn thấy rằng nó là một phần của nhóm phù hợp. – user1447941

4

regex của bạn sẽ thực sự phù hợp với không chữ số, bởi vì bạn đã sử dụng * thay vì +.
Đây là những gì (tôi nghĩ) mà bạn muốn:

(\d+)(?:#p(\d+))? 
+0

Bạn chính xác; '+' sẽ là toán tử tốt hơn để sử dụng. Tôi nghĩ về việc thực hiện thay đổi đó, nhưng OP đã không xác định liệu các kịch bản không có chữ số là một khả năng hay không. Như vậy, tôi cố gắng giữ nó càng gần bản gốc càng tốt. –

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