2008-09-08 30 views
50

Từ Java 6 Pattern tài liệu:Nhóm regex độc lập là gì?

cấu trúc đặc biệt (không chụp)

(?: X)       X, như một nhóm không chụp

...

(?> X)       X, như là một độc lập, không chụp nhóm

giữa (?:X)(?>X) là những gì khác biệt? độc lập có nghĩa là gì trong ngữ cảnh này?

+0

'(?> X) [?/*/+]' Giống với '(?: X) [?/*/+] +'. – jobard

Trả lời

38

Điều này có nghĩa là việc nhóm là atomic và nó sẽ loại bỏ thông tin ngược lại cho một nhóm phù hợp. Vì vậy, biểu thức này là sở hữu; nó sẽ không trở lại ngay cả khi làm như vậy là cách duy nhất cho toàn bộ thành công của regex. Đó là "độc lập" trong ý nghĩa rằng nó không hợp tác, thông qua backtracking, với các yếu tố khác của regex để đảm bảo một trận đấu.

6

Nếu bạn có foo(?>(co)*)co, điều đó sẽ không bao giờ khớp. Tôi chắc chắn có những ví dụ thực tế về việc khi nào điều này sẽ hữu ích, hãy thử đọc cuốn sách của O'Reilly.

+3

+1 để đề cập đến ** sách o'reilly ** –

0

(?>X[?/*/+]) giống với (?:X)[?/*/+]+.

+0

Từ 'độc lập' trong [Mẫu JavaDocs] (http://docs.oracle.com/javase/7/docs/api/java/util/regex /Pattern.html) là quan trọng. Chúng không hoàn toàn giống nhau, bởi vì '(?> X)' không thực hiện bất kỳ backtracking nào khi một phần khớp không thành công, nên một số thứ phù hợp với việc sử dụng sẽ không khớp với nhau. [Article @erickson được liên kết là hữu ích đối với tôi.] (Http://www.regular-expressions.info/atomic.html) – xdhmoore

+0

Xin lỗi, tôi không tham gia điều này, vì vậy có lẽ câu trả lời của tôi không chính xác. Nhưng từ tham chiếu của riêng bạn: "Hầu hết chúng cũng hỗ trợ định lượng sở hữu, về cơ bản là một sự thuận tiện không hợp lý cho nhóm nguyên tử." Đây là những gì tôi đã cố gắng để thể hiện. Trong trường hợp sau, ký tự '+' bổ sung có nghĩa là các vòng loại sở hữu. – beibichunai

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