2010-03-29 20 views

Trả lời

22

(?:...) vẫn trận, nó chỉ không tạo ra một nhóm mới cho các mục đích của \1/$1/.groups(1)/etc.

+0

Vì vậy, để đạt được những gì tôi muốn, tôi phải làm một = x.match (/ (ab) (?: cd) (ef) /); x = a [1] + a [2]; chính xác? – Murali

+3

@wizard: Bạn có thể làm điều đó, có, nhưng nhóm không bắt giữ không cần thiết cho biểu thức cụ thể đó. '/ (ab) cd (ef) /' sẽ làm cùng một công việc. 'x.replace (/ (ab) cd (ef) /," $ 1 $ 2 ");' sẽ làm tốt hơn, nhưng tôi tưởng tượng biểu hiện thực sự của bạn phức tạp hơn một chút so với ví dụ của bạn ở đây :-). –

5

Hiểu biết của bạn sai. Nhóm sẽ vẫn là một phần của hoạt động chụp chính, nhưng nó sẽ không được tính là bắt giữ biểu thức phụ. Sau đây sẽ trả về một mảng của hai kết quả phù hợp:

x = "abcdefg" 
x = x.match(/ab(cd)ef/) 

Chỉ số mảng 0 sẽ là "abcdef" (đối sánh hoàn chỉnh) và chỉ mục mảng 1 sẽ là "cd", biểu thức phụ. Việc thêm ?: yêu cầu regex không quan tâm đến việc nắm bắt biểu thức con, toàn bộ kết quả phù hợp vẫn được chụp hoàn toàn.

Từ các nhận xét khác của bạn, có một số cách bạn có thể làm những gì bạn đang cố gắng làm. Ví dụ:

x.replace(/(ab)cd(ef)/, "$1$2"); 
x.slice(0, x.indexOf("cd")) + x.slice(x.indexOf("cd") + 2); 
0

Ngoài các trả lời khác, nếu bạn thực sự cần phải phù hợp với chỉ những biểu hiện bên ngoài trong regex, bạn sẽ phải làm một cái gì đó như thế này:

x = "abcdefg" 
xarr = x.match(/(ab)(?:cd)(ef)/) 
x = xarr[1] + xarr[2] 

Nhưng isn thực sự regex không có nghĩa là cho trường hợp này.

+0

Cảm ơn và đồng ý với bạn, btw, tôi nghĩ bạn có nghĩa là + thay vì & – Murali

+0

Ah, vâng, tệ của tôi. Quá nhiều VB.Net. – tloflin

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