2012-12-15 28 views
14

Điều này có tồn tại không?JavaScript tương đương với chuỗi của Ruby # scan

tôi cần phải phân tích một chuỗi như:

the dog from the tree 

và nhận được một cái gì đó giống như

[[null, "the dog"], ["from", "the tree"]] 

mà tôi có thể làm trong Ruby với một RegExp và String#scan.

JavaScript của String#match không thể xử lý này vì nó chỉ trả lại những gì RegExp là lần xuất hiện và không phải là nhóm chụp, vì vậy nó sẽ trả về một cái gì đó giống như

["the dog", "from the tree"] 

Bởi vì tôi sử dụng String#scan nhiều lần trong ứng dụng của Ruby của tôi, nó sẽ là tốt đẹp nếu có một cách nhanh chóng để nhân rộng hành vi này trong cổng JavaScript của tôi.

EDIT: Đây là RegExp Tôi đang sử dụng: http://pastebin.com/bncXtgYA

Trả lời

10
String.prototype.scan = function (re) { 
    if (!re.global) throw "ducks"; 
    var s = this; 
    var m, r = []; 
    while (m = re.exec(s)) { 
     m.shift(); 
     r.push(m); 
    } 
    return r; 
}; 
+0

Tôi đã thêm mã này vào mã của mình và trực tiếp thay thế '.match' thành' .scan' nhưng vẫn không hoạt động. Đây là RegExp tôi đang sử dụng: http://pastebin.com/bncXtgYA (chuỗi kiểm tra: '" con chó trong cây "') Tôi sao chép RegExp trực tiếp từ Ruby và tôi mới vào JS RegExp để có thể là một số vấn đề với nó. – itdoesntwork

+0

"* không hoạt động *" là vô nghĩa. Tôi đã thử '" con chó trong cây ".scan (/ (?: (Trong | thành | đến | tại | từ))? ((? :(?: the | a | an))? (?: \ D + \. | tất cả \.)? (?: \ w + | '[a-zA-Z0-9 \ s] *?'))/gi) 'và có' [[không xác định, "con chó"], [" trong "," cây "]]'. – melpomene

+0

Ah, xin lỗi, tôi là một dum-dum và tôi đã không đọc đầu ra một cách chính xác. Cảm ơn! – itdoesntwork

5

Dưới đây là thực hiện khác sử dụng String.replace:

String.prototype.scan = function(regex) { 
    if (!regex.global) throw "regex must have 'global' flag set"; 
    var r = [] 
    this.replace(regex, function() { 
     r.push(Array.prototype.slice.call(arguments, 1, -2)); 
    }); 
    return r; 
} 

Cách hoạt động: replace sẽ gọi gọi lại vào mỗi trận đấu, đi qua nó là chuỗi con phù hợp, các nhóm phù hợp, độ lệch và chuỗi đầy đủ. Chúng tôi chỉ muốn các nhóm phù hợp, vì vậy chúng tôi slice ra các đối số khác.

+0

Tôi đã nhìn thấy điều này được đề cập trước đây, nhưng không bao giờ hiểu làm thế nào một cái gì đó như thế này sẽ được thực hiện. Tôi sẽ thử nó ngay bây giờ. Cảm ơn! – itdoesntwork

+0

Và, bằng cách này, đây là RegExp tôi đang sử dụng. Có điều gì tôi đang làm sai lầm khủng khiếp không? http://pastebin.com/bncXtgYA – itdoesntwork

+0

@ itdoesntwork nó hoạt động với tôi trong Chrome. Bạn đang sử dụng phiên bản trình duyệt/trình duyệt nào? – int3

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