2011-07-18 15 views
10

modelinde başarısız oluyor. Tüm gün bununla güvendim ve yanlış bir şey yapıp yapmadığımı veya Chrome'un JavaScript altyapısında bir hata tespit ettiğimi anlayamıyorum . Küresel bayrağa sahip bir RegExp nesnesine yapılan art arda yapılan çağrıların, aynı girdi dizesi için tutarsız sonuçlar döndürdüğü anlaşılıyor. Aşağıdaki işlevi ile test ediyorum:RegExp testine yapılan art arda yapılan çağrılar, global seçenek

function testRegex(pattern, array) { 
    document.writeln('Pattern = ' + pattern + ', Array = ' + array + '<br/>'); 
    for (var ii = 0; ii < array.length; ii++) { 
     document.writeln(ii + ', '); 
     document.writeln(array[ii] + ', '); 
     document.writeln(pattern.test(array[ii]) + '<br />'); 
    } 
    document.writeln('<br/>'); 
} 

Ben desen ve dizeleri çeşitli diziler olarak /a/g ile işlevini çağırdığınızda, ben bildiğim kadarıyla söyleyebilirim yanlış birçoğu aşağıdaki sonuçları almak:

// EXPECTED: True 
// ACTUAL: True 
testRegex(/a/g, ['a']); 

// EXPECTED: True, True 
// ACTUAL: True, False 
testRegex(/a/g, ['a', 'a']); 

// EXPECTED: True, True, True 
// ACTUAL: True, False, True 
testRegex(/a/g, ['a', 'a', 'a']); 

// EXPECTED: True, False, True 
// ACTUAL: True, False, True 
testRegex(/a/g, ['a', 'b', 'a']); 

// EXPECTED: True, True, True, True 
// ACTUAL: True, False, True, False 
testRegex(/a/g, ['a', 'a', 'a', 'a']); 

// EXPECTED: True, False, False, True 
// ACTUAL: True, False, False, True 
testRegex(/a/g, ['a', 'b', 'b', 'a']); 

Ben dizeleri aynı diziler ile aynı işlevi çağırır, ancak desen olarak /a/ geçmesi

, gerçek sonuçlar tüm sonuçlar elde edildi. http://jsfiddle.net/FishBasketGordo/gBWsN/

bir şey eksik:

// EXPECTED: True 
// ACTUAL: True 
testRegex(/a/, ['a']); 

// EXPECTED: True, True 
// ACTUAL: True, True 
testRegex(/a/, ['a', 'a']); 

// EXPECTED: True, True, True 
// ACTUAL: True, True, True 
testRegex(/a/, ['a', 'a', 'a']); 

// EXPECTED: True, False, True 
// ACTUAL: True, False, True 
testRegex(/a/, ['a', 'b', 'a']); 

// EXPECTED: True, True, True, True 
// ACTUAL: True, True, True, True 
testRegex(/a/, ['a', 'a', 'a', 'a']); 

// EXPECTED: True, False, False, True 
// ACTUAL: True, False, False, True 
testRegex(/a/, ['a', 'b', 'b', 'a']); 

Yukarıdaki kod bir çalışma örnek oluşturduk? Kalıp küresel olup olmadığına bakılmaksızın, sonuç verilen diziler dizisi için aynı olmamalıdır. Ben öncelikle Chrome'da çalışıyoruz, Not, ancak test döngü değiştirirseniz aşağıdaki gibi Firefox 4 ve IE 8.

cevap

15

benzer yanlış sonuçlar gözlemlenmiştir ettik:

for (var ii = 0; ii < array.length; ii++) { 
    document.writeln(ii + ', '); 
    document.writeln(array[ii] + ', '); 
    document.writeln(pattern.test(array[ii]) + '<br />'); 
    pattern.lastIndex = 0; 
} 

Sonra kodu, iş. Sorun şu ki "g" bayrağı RegExp nesnesinin sıkışmasına neden oluyor. "LastIndex" değeri, "g" nedeniyle bu döngünün ilk yinelemesinden sonra 1 olarak ayarlanır. Aramayı sıfırlamak için geri ayarlamadıysanız, o zaman ikinci aramada sizden offset 1'den devam etmesini istediğinizi varsayarsınız.

"g" bayrağını bağlam dışında düzenli olarak kullanma Bir ".replace()" çağrısının, tekil anlamsal anlamları vardır.

+0

İle başlayan küresel seçeneği kullanılarak neden, ama benim RegExp gibi, ben bir ara adım saplanıp sonunda replace' 'de RegExp kullanmaktı bu sabah yola çıkıp Amacım, . – FishBasketGordo

6

Bu bir hata değil, bir özelliktir. Aldığınız sonuçlar "yanlış" değil, sadece beklenmedik.

10.3.2. RegExp Örnek Özellikler

Her bir RegExp nesnesinin beş özelliği vardır. Kaynak özellik, normal ifadenin metnini içeren salt okunur bir dizedir. Genel özellik, normal ifadenin g bayrağına sahip olup olmadığını belirten salt okunur bir boole değeridir. IgnoreCase özelliği, normal ifadenin i bayrağı olup olmadığını belirten salt okunur bir boole değeridir. Çok satırlı özellik, normal ifadenin m bayrağı olup olmadığını belirten salt okunur bir boole değeridir. Son özellik, read-write tamsayı olan lastIndex'dir. G bayrağına sahip desenler için, bu özellik dizgesindeki konumu kaydeder ve sonraki arama başlar. Önceki bölümde açıklandığı gibi exec() ve test() yöntemleri tarafından kullanılır.

Source

İlgili konular