Đầ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 +
, *
và {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 0
và 1
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 0
và 1
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 (Trol
và olo!
) như trong trường hợp Javascript với chụp l
và !
, tương ứng, mà là một lần nữa hoàn toàn tốt đẹp.
'JS' và' JS'' là gì? Có gì khác biệt? –
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ế. –