2013-07-29 32 views
5

Tôi vừa thực hiện các trò chơi ô chữ regex hài hước ở số http://regexcrossword.com/ - và phát hiện ra tôi không hiểu định nghĩa của các nhóm có nghĩa là gì, ví dụ: (.) (.) + Hoặc *Regex, nhóm & quantifyer

Hãy để tôi thử tại http://ole.michelsen.dk/tools/regex.html, nó cung cấp các JavaScript và PHP engine regex: "Trololo"

Chuỗi để phù hợp chống lại là (không có dấu ngoặc kép). (Nếu chuyển vào "trận đấu toàn cầu" thay đổi một cái gì đó, nó được thêm vào như là phiên bản sơn lót, đó là JS', vì nó không thay đổi bất cứ điều gì trong chế độ PHP.)

JS, (.)+ => 0: Trololo! 1: ! 
JS', (.)+ => 0: Trololo! 
PHP, (.)+ => 0: Trololo! 0: ! 
JS, (.)* => 0: Trololo! 1: ! 
JS', (.)* => 0: Trololo! 
PHP, (.)* => 0: Trololo! 1: 0: ! 1: 
JS, (.){5} => 0: Trolo 1: o 
JS', (.){5} => 0: Trolo 
PHP, (.){5} => 0: Trolo 0: o 
JS, (.){4} => 0: Trol 1: l 
JS', (.){4} => 0: Trol 1: olo! 
PHP, (.){4} => 0: Trol 1: olo! 0: l 1: ! 

Có bất kỳ câu trả lời bản quy phạm gì ngữ nghĩa của điều này là?

+0

'JS' và' JS'' là gì? Có gì khác biệt? –

+1

Tôi nghĩ rằng trang web không cung cấp cho bạn các nhóm chính xác. Sử dụng http://www.regexplanet.com/ để thay thế. –

Trả lời

3

Đầu ra không được gắn nhãn chính xác, đó là tất cả.

Trước hết, những gì nên xảy ra? Nếu bạn lặp lại một nhóm, mỗi cá thể mới sẽ ghi đè lần chụp cuối cùng. Nếu nhóm không được sử dụng ở tất cả, nó sẽ trả về một chuỗi rỗng hoặc một cái gì đó giống như undefined trong JS (nó phụ thuộc vào hương vị). Có một bài viết hay về số regular-expressions.info về vấn đề này.

Bây giờ, làm thế nào để chúng tôi nhận được kết quả của bạn? Hãy bắt đầu với JavaScript.

Tất cả các ví dụ được gắn nhãn JS (các ví dụ không phải là toàn cục) phù hợp với mô tả ở trên. Chúng khớp với số ký tự mong muốn trong 0 và chụp ký tự cuối cùng trong 1. Vì vậy, chúng ta có thể bỏ qua những điều này.

Điều gì có tính toàn cầu? Ở đây đầu ra được diễn giải không chính xác. Khi bạn sử dụng cờ toàn cầu với chức năng String.match(), bạn sẽ không nhận được một mảng của tất cả các ảnh chụp nữa - nhưng chỉ là một mảng của tất cả các kết quả phù hợp (nhóm 0 cho mỗi trận đấu). Do đó, trong trường hợp của +, *{5} nơi chỉ có một kết quả phù hợp, bạn chỉ nhận được một kết quả đó. Với {4} có đủ chỗ cho hai kết quả phù hợp trong chuỗi đích, do đó mảng kết quả chứa hai phần tử. Để có được tất cả các ảnh chụp với cờ toàn cầu, bạn cần phải viết một vòng lặp và sử dụng RegExp.exec() thay thế (cung cấp cho bạn một kết quả phù hợp tại một thời điểm, nhưng tất cả các lần chụp của nó).

Và điều gì với PHP? Dường như nó đang sử dụng preg_match_all, đó là toàn cục, đó là lý do tại sao sử dụng g không có hiệu lực. Các + cho kết quả bạn mong đợi một lần nữa. Vì vậy, {5}.

Điều gì khác với hai cái kia? Ở đây, đầu ra đã được hiểu sai vòng. Theo mặc định, preg_match_all cung cấp mảng hai chiều, trong đó chỉ mục đầu tiên tương ứng với nhóm và chỉ mục thứ hai tương ứng với đối sánh. Trong đầu ra của bạn, nó được diễn giải theo cách khác. Do đó, khi có nhiều kết quả phù hợp, cặp đầu tiên của 01 là toàn bộ kết hợp của hai kết quả phù hợp được tìm thấy. Cặp thứ hai 01 là những gì bạn đã chụp trong hai trận đấu đó.

Vì vậy, đối với *, trước tiên bạn nhận được chuỗi đầy đủ dưới dạng đối sánh và ký tự cuối cùng là ảnh chụp (hai thứ được gắn nhãn 0), điều này là chính xác. Và sau đó, kể từ * cho phép các kết quả không có chiều rộng bằng không, bạn sẽ nhận được một kết quả trống (trống) khác ở cuối chuỗi, cùng với một lần chụp trống.Tôi không chắc chắn lý do tại sao ví dụ JS' tương ứng không chứa chuỗi trống bổ sung, bởi vì String.match cũng sẽ làm điều tương tự.

Và đối với {4}, bạn chỉ nhận được hai trận đấu (Trololo!) như trong trường hợp Javascript với chụp l!, tương ứng, mà là một lần nữa hoàn toàn tốt đẹp.

+0

> Trước hết, điều gì sẽ xảy ra? Chính xác, đó là câu hỏi :-) Tôi thực sự mong đợi, kết hợp (.) * Trên abcd sẽ cho 0. abcd 1. a 2. b 3. c 4. d - nghĩa là, tôi nhận được nhiều nhóm hơn, như người định lượng dường như định lượng nhóm. Nhưng suy nghĩ về nó lâu hơn, có vẻ như không thể sử dụng được chút nào, vì các tham chiếu nhóm được sửa chữa. – Falko

+1

@ Falko, hương vị regex duy nhất thực hiện điều đó là .NET. Ở đó bạn nhận được một đối tượng nhóm cho mỗi nhóm chứa một bộ sưu tập các ảnh chụp. –

+0

Ah, tuyệt. Nhưng như đã đề cập, tôi không thể tưởng tượng làm thế nào điều này có thể hữu ích trong thực tế. – Falko

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