Khi bạn lặp lại một nhóm chụp, trong hầu hết các phiên bản, chỉ có lần chụp cuối cùng được giữ lại; mọi ảnh chụp trước đó đều bị ghi đè. Trong một số trường hợp, chẳng hạn như .NET, bạn có thể nhận được tất cả các bản chụp trung gian, nhưng đây không phải là trường hợp của Javascript.
Có nghĩa là, trong Javascript, nếu bạn có một mẫu với N nhóm bắt, bạn chỉ có thể chụp chính xác N chuỗi cho mỗi trận đấu, ngay cả khi một số nhóm đó được lặp lại.
Vì vậy, nói chung, tùy thuộc vào những gì bạn cần làm:
- Nếu đó là một tùy chọn, thay vào đó hãy phân tách trên các dấu phân cách
- Thay vì khớp
/(pattern)+/
, có thể khớp /pattern/g
, có thể trong một exec
vòng lặp
- Xin lưu ý rằng hai điều này không hoàn toàn tương đương, nhưng nó có thể là một tùy chọn
- Thực hiện đối sánh đa cấp:
- Chụp nhóm lặp lại trong một trận đấu
- Sau đó, chạy một regex khác để phá vỡ trận đấu đó
Người giới thiệu
Thí dụ
Dưới đây là một ví dụ về đối sánh <some;words;here>
trong một văn bản, sử dụng một exec
vòng lặp, sau đó tách ra ;
để lấy các từ riêng lẻ ( xem thêm trên Ideone.com ):
var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";
var r = /<(\w+(;\w+)*)>/g;
var match;
while ((match = r.exec(text)) != null) {
print(match[1].split(";"));
}
Mẫu được sử dụng là:
_2__
/ \
<(\w+(;\w+)*)>
\__________/
1
Trận đấu này <word>
, <word;another>
, <word;another;please>
vv Nhóm 2 được lặp đi lặp lại để nắm bắt bất kỳ số từ, nhưng nó chỉ có thể giữ cho chụp cuối cùng. Toàn bộ danh sách các từ được nhóm 1 nắm bắt; chuỗi này sau đó split
nằm trên dấu phân cách dấu chấm phẩy.
Câu hỏi liên quan