2012-11-06 11 views
10

Gdybym miał wyrażenie regularne z, powiedzmy 13 grupami przechwytującymi, w jaki sposób określiłbym ciąg zastępczy, który zawierał pierwszą referencję zwrotną, a następnie literał "3"?Odwołanie do skryptu JavaScript po numerze

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/; 
"one2345678910111213".replace(regex,"$13"); 
//Returns "13". How do I return "one3"? 

Najbliższy pytanie mogłem znaleźć był this one, ale odnosi się do Perl i nie obejmują ustalony dosłowne.

Spojrzałem również na numer docs na MDN, ale w przykładach nic nie zostało wyraźnie powiedziane ani przedstawione.

Odpowiedz

12

Dobry połów! Jedynym rozwiązaniem udało mi się wymyślić to:

var regex = /(one)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)/; 
"one2345678910111213".replace(regex, function(match, $1) { return $1 + "3"; }); 

EDIT Spojrzałem w górę ECMAScript spec i wygląda jak jest to możliwe bez wywołania zwrotnego. Niektóre silniki zastępujące RegExp - na przykład Python - mają konstrukcję \g (dla "grupy"), gdzie można użyć czegoś takiego jak \g{1}3 w ciągu zastępującym; ale JavaScript po prostu używa $nn. Oznacza to, że jeśli masz więcej niż 9 grup przechwytywania, można użyć dwucyfrowy tylną odniesienie do usunięcia niejasności, tak:

"one2345678910111213".replace(regex, "$013"); 
+0

+1, ale to nadal jest zwrotna. Czy to oznacza, że ​​nie można tego zrobić za pomocą argumentu łańcuchowego? –

+0

Szczerze mówiąc, nie wiem jak to zrobić bez korzystania z oddzwaniania: Próbowałem różnych rzeczy, ale to było jedyne, które działało. Być może nie jest to możliwe z prostym łańcuchem. – Xophmeister

+2

... Jest to możliwe :) Zobacz edytuj! – Xophmeister

5

Wystarczy dodać zwięzłą odpowiedź na przyszłość:

Wsteczne mieć co najwyżej dwie cyfry, tak aby wykorzystać wsteczne # 1, a następnie dosłownym liczebnika, nazywają to „01” zamiast „1”:

"one2345678910111213".replace(regex,"$013"); 
Powiązane problemy