2011-08-25 6 views
12

Zgodnie z tą witryną powinna działać następująca metoda zamiany, choć jestem sceptyczna. http://www.bennadel.com/blog/55-Using-Methods-in-Javascript-Replace-Method.htmJavaScript: Przekazywanie funkcji z dopasowaniami do zastąpienia (regex, func (arg)) nie działa

Mój kod wygląda następująco:

text = text.replace( 
    new Regex(...), 
    match($1) //$.. any match argument passed to the userfunction 'match', 
       // which itself invokes a userfunction 
); 

używam Chrome 14, a nie przejdzie żadnych parametrów przekazywanych do funkcji meczu?

Aktualizacja:

Działa przy użyciu

text.replace(/.../g, myfunc($1)); 

Interpreter JavaScript spodziewa się zamknięcie - pozorne userfunctions wydają się prowadzić do problemów z zakresu tj dalsze userfunctions nie zostanie wywołany. Początkowo chciałem uniknąć zamknięć, aby zapobiec potrzebnemu zużyciu pamięci, ale są już zabezpieczenia.

przekazać argumenty do własnych funkcji zrobić to w ten sposób (w którym argument [0] będzie zawierać cały mecz:

result= text.replace(reg , function(){ 
     return wrapper(arguments[0]); 
}); 

Dodatkowo miałem problem w łańcuchu-ucieczki i tym samym regex ekspresja w następujący sposób:

/\s......\s/g

nie jest taki sam jak

new Regex ("\s......\s" , "g") lub
new Regex ('\s......\s' , "g")

więc należy zachować ostrożność!

+0

mógłby pan wyjaśnić, co masz na myśli używając 'text.replace (/ .../g, myfunc (1 $)); '? Wierzę, że tak naprawdę nie działa, ponieważ '$ 1' musi być w ciągu znaków. – JacobEvelyn

+0

Zobacz mój komentarz do odpowiedzi Joe, a tutaj na przykład: https://github.com/lsauer/KeyBoarder/blob/master/keyboarder.js#L511 –

+0

Nadal nie jestem pewien, czy rozumiem. Używanie funkcji w tym miejscu ma sens, ale oczekiwanie, że '$ 1' ma jakąś wartość, nie ma sensu. – JacobEvelyn

Odpowiedz

35

1 $ musi być wewnątrz łańcucha:

"string".replace(/st(ring)/, "gold $1") 
// output -> "gold ring" 

z funkcją:

"string".replace(/st(ring)/, function (match, capture) { 
    return "gold " + capture + "|" + match; 
}); 
// output -> "gold ring|string" 
+0

tak, w ciągu $ 1 analizowana jest przez funkcję replace. W przykładowym kodzie $ 1 jest dowolną zmienną, wziętą z przykładu w linku. --- --- Jednak najlepiej jest przekazywać argumenty [0], ponieważ ostatni argument będzie zawierał cały tekst. –

+0

Trochę zaszumiałem, żeby owinąć mi głowę, ale dokładnie to, czego potrzebowałem. – Twisty

Powiązane problemy