2012-12-15 11 views
14

Czy to istnieje?JavaScript odpowiadający ciągowi Ruby # scan

muszę analizować ciąg jak:

the dog from the tree 

i dostać coś takiego

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

które można zrobić w Ruby z jednej RegExp i String#scan.

JavaScript na String#match nie może sobie z tym poradzić, jak tylko wrócić co RegExp jest dopasowany, a nie grupy przechwytywania, więc zwraca coś takiego

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

Ponieważ użyłem String#scan wiele razy w mojej aplikacji Ruby, byłoby miło, gdyby był szybki sposób na zreplikowanie tego zachowania w moim porcie JavaScript.

EDIT: Oto RegExp Używam: http://pastebin.com/bncXtgYA

Odpowiedz

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

Dodałem to do mojego kodu i bezpośrednio zastąpiłem '.match' na' .scan', ale nadal nie działa. Oto RegExp, którego używam: http://pastebin.com/bncXtgYA (ciąg testowy: '" pies w drzewie "') Skopiowałem ten RegExp bezpośrednio z Ruby i jestem nowy w JS RegExp, więc może być z tym trochę problemami. – itdoesntwork

+0

"* nie działa *" jest bez znaczenia. Próbowałem "" psa w drzewie ".scan (/ (? :(in | into | to | at | from))? ((? :(?: the | a | an))? (?: \ D + \. | all \.)? (?: \ w + | '[a-zA-Z0-9 \ s] *?'))/gi) 'i otrzymał' [[undefined, "pies"], [" w "," drzewie "]]'. – melpomene

+0

Ah, przepraszam, jestem dum-dum i nie odczytałem poprawnie wyniku. Dzięki! – itdoesntwork

5

Oto kolejna realizacja z wykorzystaniem 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; 
} 

Jak to działa: replace będzie powoływać się na oddzwanianie na każdym meczu, przechodząc to dopasowany podciąg, dopasowane grupy, przesunięcie i pełny ciąg. Chcemy tylko dopasowanych grup, więc możemy slice out innych argumentów.

+0

Widziałem to już wcześniej, ale nigdy nie rozumiałem, jak coś takiego zostanie zaimplementowane. Spróbuję teraz. Dzięki! – itdoesntwork

+0

A tak przy okazji, tutaj jest RegExp, którego używam. Czy jest coś, co robię okropnie źle? http://pastebin.com/bncXtgYA – itdoesntwork

+0

@itdoesntwork to działa dla mnie w Chrome. Z jakiej wersji przeglądarki/przeglądarki korzystasz? – int3

Powiązane problemy