2012-12-15 14 views
14

Bu var mı? Bir RegExp ve String#scan Ruby yapabileceğinizRuby's String # taramalı JavaScript eşdeğeri

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

gibi bir şey

the dog from the tree 

ve almak:

ben gibi bir dize ayrıştırmak gerekir.

JavaScript en String#match o benim Yakut uygulamada String#scan defalarca kullanılan Çünkü

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

gibi bir şey döndürür böylece, sadece RegExp yakalama gruplarını eşleşti ve ne değildir dönmek olarak bu işleyemez olurdu JavaScript portumda bu davranışı çoğaltmanın hızlı bir yolu olsaydı hoş olurdu.

DÜZENLEME: İşte http://pastebin.com/bncXtgYA

cevap

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

Bunu koduma ekledim ve '.match' yerine' .scan' olarak değiştirdim ancak hala çalışmıyor. İşte kullanıyorum RegExp: http://pastebin.com/bncXtgYA (test dizesi: '" ağacın içindeki köpek "') RegExp'i doğrudan Ruby'den kopyaladım ve JS RegExp'te yeniyim. onunla bazı problemler. – itdoesntwork

+0

"* çalışmıyor *" anlamsız. Ben "ağacın içindeki köpek" denedim .scan (/ (? :(in | in | to | at | from))? ((? :(?: the | a | an))? (?: \ D + \. | all \.)? (?: \ w + | '[a-zA-Z0-9 \ s] *?'))/gi) 've [[undefined," köpek "], [" "," ağacında "]]'. – melpomene

+0

Ah, pardon, ben bir dum-dum'um ve çıkışı doğru okumadım. Teşekkürler! – itdoesntwork

5

başka uygulama String.replace kullanıyor:

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; 
} 

Nasıl çalışır: replace her maç geri arama çağıracağı, geçen İşte kullanıyorum RegExp olduğunu eşleşen alt tabaka, eşleşen gruplar, ofset ve tam dizedir. Sadece eşleşen grupları istiyoruz, bu yüzden slice diğer argümanları çıkardık.

+0

Daha önce bahsettiğim bu durumu gördüm, ancak bunun gibi bir şeyin nasıl uygulanacağını asla anlayamadım. Şimdi deneyeceğim. Teşekkürler! – itdoesntwork

+0

Ve bu arada, kullanıyorum RegExp. Korkunç bir yanlış yaptığım bir şey var mı? http://pastebin.com/bncXtgYA – itdoesntwork

+0

@itdoesntwork Chrome'da benim için çalışıyor. Hangi tarayıcı/tarayıcı sürümünü kullanıyorsunuz? – int3

İlgili konular