2011-11-23 13 views
6

Ben bu çalıştırırsanız:Javascript'teki her eşleşmeyi bulmak için nasıl bir düzenli ifade alabilirim?

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

Tek bir sonuçla bir dizi geri almak:

['12'] 

nasıl onlar üst üste bile, tüm sonuçları döndürmek için alabilirim? ,

'1234567'.match(...); 

bana

[12 ile bir dizi, 34 vermelidir:

['12', '21'] 

DÜZENLEME: Ya daha iyi bir örnek olacağını ben sonucu bu olmak istiyorum 45, 56, 67]

+0

soru nedir? –

+1

Bu dizgeden '12' ve '21' ikisini birden almaya çalışıyorum - bunun yerine '12' aldım çünkü normalde bir motor bir eşleşme bulduktan sonra durur. – Nick

cevap

4

bu sadece istediğiniz gibi çalışmayacaktır. [0-9]{2}, match() desenini belirttiğinizde, iki basamaklı sayının ilk oluşumunu arar, daha sonra o yerden aramaya devam eder.

dize uzunluğu 3 olduğu için, başka bir eşleşme bulamayacaktır.

İki basamaklı tüm sayıları bulmak için farklı algoritmalar kullanmalısınız. İlk maçınızın kombinasyonunu kullanmanızı öneririm ve aşağıdaki regex

/[0-9]([0-9]{2})/ ile bir tane daha yapın ve hem birinci hem de ikinci çalıştırma kümelerini birleştirin.

1

Çok özlü değil, ama bu:

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

['12','23','34','45','56','67'] için matches ayarlayacaktır. Gerçekte onları yutmadan eşleşmeleri bulmak için bir lookahead iddiası kullanarak çalışır. (replace aslında bu durumda hiçbir şey değiştirmez; sadece belirli bir dizeye bir regex-maçının tüm örnekleri olarak bir anonim uygulamak için uygun bir yoldur.)

3

Böyle yapabilirsiniz:

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 

.exec()'a birden çok çağrı alır ve daha sonra .lastIndex değerini kullanmanız gerekir, böylece yeniden görünmesini istediğiniz yere başlayacaktır.

Burada çalıştığını görebilirsiniz: http://jsfiddle.net/jfriend00/XsNe5/.

Birden çok kez .exec() numaralı telefonun nasıl çalıştığını buradan öğrenebilirsiniz: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/RegExp/exec.

1

İşte 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 

ruakh aynı fikir, ama biraz daha farklı bir yaklaşım kullanarak başka bir örnektir.

6

Bu, çoğu pcre motorlarıyla çalışır.
Capture 2, 1 tüketin.

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

Ben javascript yeniyim. Bu çalışır:

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

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

print (results); 

Çıktı: 12,23,34,45,56,67