2010-03-29 16 views

Odpowiedz

22

(?:...) nadal mecze, to po prostu nie tworzy nową grupę dla celów \1/$1/.groups(1)/etc.

+0

Aby osiągnąć to, co chcę, musiałbym zrobić = x.match (/ (ab) (?: cd) (ef) /); x = a [1] + a [2]; poprawny? – Murali

+3

@wizard: Możesz to zrobić, tak, ale grupa przechwytująca nie jest potrzebna do tego konkretnego wyrażenia. '/ (ab) cd (ef) /' wykonałby tę samą pracę. 'x.replace (/ (ab) cd (ef) /," $ 1 $ 2 ");' zrobiłoby to jeszcze lepiej, ale wyobrażam sobie, że twoja prawdziwa ekspresja jest trochę bardziej skomplikowana niż twój przykład tutaj :-). –

5

Twoje zrozumienie jest złe. Grupa nadal będzie częścią głównego przechwytywania, ale nie będzie liczona jako przechwytywanie podekspresji. Następujące wróci tablicę z dwóch wyników:

x = "abcdefg" 
x = x.match(/ab(cd)ef/) 

indeksu tablicy 0 będzie „ABCDEF” (pełna dopasowanie) i wskaźnik tablicy 1 będzie „cd” wychwytywanie sub ekspresja. Dodanie ?: mówi regexowi, aby nie przejmował się przechwytywaniem podekspozycji, pełny mecz jest nadal w pełni przechwytywany.

Z pozostałych komentarzy wynika, że ​​możesz zrobić to, na co masz ochotę. Na przykład:

x.replace(/(ab)cd(ef)/, "$1$2"); 
x.slice(0, x.indexOf("cd")) + x.slice(x.indexOf("cd") + 2); 
0

W uzupełnieniu do innych odpowiedzi, jeśli naprawdę potrzebujesz, aby dopasować tylko poza wyrażeń regex, to musiałby zrobić coś takiego:

x = "abcdefg" 
xarr = x.match(/(ab)(?:cd)(ef)/) 
x = xarr[1] + xarr[2] 

ale naprawdę regex ISN jest przeznaczony dla tej sprawy.

+0

Dziękuję i zgadzam się z tobą, btw, myślę, że masz na myśli + zamiast & – Murali

+0

Ah, tak, moje złe. Za dużo VB.Net. – tloflin

Powiązane problemy