2012-08-09 12 views
5

Tôi khá chắc chắn sau khi trải qua đêm cố gắng tìm câu trả lời rằng điều này là không thể, và tôi đã phát triển một công việc xung quanh - nhưng, nếu ai đó biết về một phương pháp tốt hơn, tôi rất muốn nghe nó ...JavaScript tham chiếu trở lại tham chiếu trả về một mảng các kết quả phù hợp từ nhóm đơn lẻ (nhiều nhóm)

Tôi đã trải qua rất nhiều lần lặp lại mã, và sau đây chỉ là một dòng suy nghĩ thực sự. Tại một số điểm, tôi đã sử dụng lá cờ toàn cầu, tôi tin rằng, để cho trận đấu() có thể hoạt động, và tôi không thể nhớ nó có cần thiết hay không.

var str = "@[email protected]@ghi&jkl"; 
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/; 

Ý tưởng ở đây, trong mã đơn giản này, là nhóm tùy chọn 1, trong đó có số tiền không xác định, sẽ khớp với @abc, @def và @ghi. Nó sẽ chỉ chụp các ký tự alpha trong đó sẽ có một hoặc nhiều ký tự. Nhóm 2 là giống nhau, ngoại trừ các trận đấu trên biểu tượng &. Nó cũng nên được neo vào đầu và cuối của chuỗi.

Tôi muốn để có thể sao lưu tài liệu tham khảo tất cả các trận đấu của cả hai nhóm, ví dụ:

result = str.match(regex); 
alert(result[1]); //abc,def,ghi 
alert(result[1][0]); //abc 
alert(result[1][1]); //def 
alert(result[1][2]); //ghi 
alert(result[2]); //jkl 

người bạn đời của tôi nói rằng làm việc này tốt cho anh trong .net, tiếc là tôi chỉ đơn giản là không thể có được nó để làm việc - chỉ xuất hiện của bất kỳ nhóm cuối cùng được trả về trong tài liệu tham khảo trở lại, như có thể thấy trong những điều sau đây:

(bổ sung, làm cho một trong hai nhóm tùy chọn làm cho một mớ hỗn độn, cũng như thiết lập cờ toàn cầu)

var str = "@[email protected]@ghi&jkl"; 
var regex = /(?:@([a-z]+))(?:&([a-z]+))/; 

var result = str.match(regex); 

alert(result[1]); //ghi 
alert(result[1][0]); //g 
alert(result[2]); //jkl 

Sau đây là giải pháp tôi đến, nắm bắt được toàn bộ phần trong câu hỏi, và tạo ra mảng bản thân mình:

var str = "@[email protected]@ghi&jkl"; 
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/; 

var result = regex.exec(str); 

alert(result[1]); //@[email protected]@ghi 
alert(result[2]); //jkl 

var result1 = result[1].toString(); 
result[1] = result1.split('@') 

alert(result[1][1]); //abc 
alert(result[1][2]); //def 
alert(result[1][3]); //ghi 
alert(result[2]); //jkl 

Trả lời

4

Đó là chỉ đơn giản là không phải là cách .match() công trình trong JavaScript. Mảng trả về là một mảng các chuỗi đơn giản. Không có "lồng ghép" các nhóm chụp; bạn chỉ cần đếm các ký hiệu ( từ trái sang phải.

Chuỗi đầu tiên (tại chỉ số [0]) luôn là chuỗi được đối sánh chung. Sau đó, đến các nhóm chụp, một chuỗi (hoặc null) cho mỗi phần tử mảng.

Bạn có thể, như bạn đã làm, sắp xếp lại mảng kết quả thành nội dung trái tim của bạn. Nó chỉ là một mảng.

chỉnh sửa — oh, và lý do result[1][0] của bạn là "g" là ký hiệu mảng lập chỉ mục áp dụng cho một chuỗi được bạn những nhân vật cá nhân của chuỗi.

+0

Cảm ơn bạn đã trả lời. Tôi nghĩ rằng có thể có một giải pháp thanh lịch hơn. http://stackoverflow.com/a/1412662/1455709 là câu trả lời gần nhất mà tôi có thể tìm thấy, tuy nhiên không thành công khi làm phức tạp biểu hiện và giầy nó thành những gì tôi đã theo sau ... – Patrick

+0

Bạn được chào đón. May mắn nhất! – Pointy