2011-11-23 9 views
6

Jeśli uruchomię to:Jak mogę uzyskać wyrażenie regularne, aby znaleźć wszystkie dopasowania w javascript?

'121'.match(/[0-9]{2}/gi) 

wrócę tablica z pojedynczego wyniku:

['12'] 

Jak mogę zmusić go do powrotu wszystkich wyników, nawet jeśli one się pokrywają? Chcę rezultatem będzie to:

['12', '21'] 

EDIT: Albo lepiej Przykładem może być:

'1234567'.match(...); 

powinien dać mi tablicę z

[12 34, 45, 56, 67]

+0

Jakie jest pytanie? –

+1

Próbuję uzyskać zarówno "12" i "21" z tego ciągu - zamiast tego po prostu dostaję "12", ponieważ silnik regex zatrzymuje się po znalezieniu dopasowania. – Nick

Odpowiedz

4

to po prostu nie zadziała tak, jak chcesz.

Po określeniu wzoru [0-9]{2}, match() wyszukuje pierwsze wystąpienie liczby dwucyfrowej, a następnie kontynuuje wyszukiwanie z tego miejsca. ponieważ długość łańcucha wynosi 3, oczywiście nie znajdzie innego dopasowania.

należy użyć innego algorytmu do wyszukiwania wszystkich dwucyfrowych liczb. Proponuję użyć kombinacji pierwszego meczu i zrobić jeszcze jeden z następującym regex

/[0-9]([0-9]{2})/ i połączyć zestawy zarówno pierwszego, jak i drugiego.

1

To nie jest bardzo zwięzłe, ale w ten sposób:

var matches = []; 
'1234567'.replace 
(
    /(?=[0-9]{2})/gi, 
    function(s,pos,str) 
    { 
    matches.push(str.substr(pos, 2)); 
    } 
); 

ustawi matches do ['12','23','34','45','56','67']. Działa przy użyciu twierdzenia z wyprzedzeniem, aby znaleźć dopasowania bez ich rzeczywistego połknięcia. (The replace faktycznie nie zastąpi nic w tym przypadku, jest to tylko wygodny sposób, aby zastosować zamknięcie do wszystkich instancji regex-meczu w danym ciągu znaków.)

3

Można to zrobić tak:

var str = '121'; 
var results = []; 
var re = /[0-9]{2}/gi, matches; 
while (matches = re.exec(str)) { 
    results.push(matches[0]); 
    re.lastIndex -= (matches[0].length - 1); // one past where it matched before 
} 
// results is an array of matches here 

Wykonuje wiele połączeń do .exec(), a następnie trzeba manipulować wartością .lastIndex, aby rozpocząć od miejsca, w którym ma wyglądać ponownie.

Możesz zobaczyć, że działa tutaj: http://jsfiddle.net/jfriend00/XsNe5/.

Możesz przeczytać o tym, jak wiele razy dzwoni .exec() tutaj: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec.

1

Oto kolejny przykład stosując lookaheads

var str = "12345", 
    regexp = /\d(?=(\d))/g, 
    results = [], 
    m = null; 

while(m = regexp.exec(str)) results.push(m.join('')); 

alert(results) // 12,23,34,45 

sam pomysł jak ruakh, ale nieco inne podejście.

6

Działa z większością silników PC.
Przechwyć 2, zużyj 1.

/(?=(\d\d))\d/g

Jestem nowy w javascript. To działa:

var pat = /(?=(\d\d))\d/g; 
var results = []; 
var match; 

while ((match = pat.exec('1234567')) != null) { 
    results.push(match[1]); 
} 

print (results); 

wyjściowa: 12,23,34,45,56,67

Powiązane problemy