2016-04-05 12 views
2

Ben 7:55am - 9:10am (TR) 8:10am - 9:00am (W) ve çıkış regex sonucunu içeren çok boyutlu] dizisi şeklinde bir dize ayrıştırmak bir işlev yazmaya çalışıyorum içinde (ex [[7:55am, 9:10am, TR], [7:55am, 9:00am, W]]) doğru sonucuRegex exec fonksiyonu JavaScript

Bu edilir dönen değil

function parseClassTime(times) { 
    console.log("Input: " + times); 
    var timeArr = []; 
    var finalArr = []; 
    regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w{1,5})\)/g; 
    if (times.indexOf(") ") > -1) { 
     times = times.replace(") ", ")&"); 
     timeArr = times.split("&"); 
    } else { 
     timeArr.push(times); 
    } 
    console.log("timeArr: " + timeArr); 
    for (i = 0; i < timeArr.length; i++) { 
     console.log(i + ":" + timeArr[i]); 
     console.log("regexResult: " + regexStr.exec(timeArr[i])); 
    } 
}; 

Ve bu alıyorum çıkışı: my fonksiyonu bu haliyle

Input: 7:55am - 9:10am (TR) 8:10am - 9:00am (W) 
timeArr: 7:55am - 9:10am (TR),8:10am - 9:00am (W) 
0:7:55am - 9:10am (TR) 
regexResult: 7:55am - 9:10am (TR),7:55am,9:10am,TR 
1:8:10am - 9:00am (W) 
regexResult: null 

Hayatım boyunca, null'un nereden geldiğini bulamıyorum. İki çağrı arasındaki regex dizesine .exec() arasında bir şey mi oluyor?

Lütfen düşüncelerinizi bildirin!

+0

Sadece {0,5} 'ile' {1,5} 'arasında değiştirin. Sanırım sıfır uzunluğa da denk geliyor. –

+0

Öncelikle, 'am' ve 'pm 'sarkıyorsunuz, daha sonra yukarıdaki gibi - [0,5}' 0 karakterleri eşleştirebiliyor. '(\ D {1,2}: \ d {2} [ap] m)' yi deneyin - (\ d {1,2}: \ d {2} [ap] m) \ ((\ w +) \) ' . –

+0

Öneriler için teşekkürler çocuklar! Ben değiştirdim ancak hala bir null değer alıyorum – wKavey

cevap

1

Sadece [RegExp.exec()][1] çalışır: lastIndex özelliği ilk eşleşmeden sonra 20'ye ayarlandı ve sıfırlamadınız. İkincisi, 20 nolu pozisyonda bir eşleşme aramaya başladığında hiçbir şeyle eşleşemedi. Bu, regex global değiştirici /g ile oluşturulduğu için bu şekilde oluyor. normal ifadeniz "g" bayrak kullanıyorsa

, aynı dizede ardışık eşleşmeleri bulmak için exec() yöntem birden çok kez kullanabilirsiniz.

function parseClassTime(times) { 
 
    console.log("Input: " + times); 
 
    var timeArr = []; 
 
    var finalArr = []; 
 
    regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w{1,5})\)/g; 
 
    if (times.indexOf(") ") > -1) { 
 
     times = times.replace(") ", ")&"); 
 
     timeArr = times.split("&"); 
 
    } else { 
 
     timeArr.push(times); 
 
    } 
 
    console.log("timeArr: " + timeArr); 
 
    for (i = 0; i < timeArr.length; i++) { 
 
     regexStr.lastIndex = 0;    // <= HERE!! 
 
     console.log(i + ":" + timeArr[i]); 
 
     console.log("regexResult: " + regexStr.exec(timeArr[i])); 
 
    } 
 
}; 
 

 
parseClassTime("7:55am - 9:10am (TR) 8:10am - 9:00am (W)");

Veya daha kısa bir yol: Bunu yaparken, arama

el regexStr.lastIndex sıfırlayabilirsiniz düzenli ifadenin lastIndex özelliği tarafından belirtilen str ait alt dize başlar :

var finalArr = []; 
 
var regexStr = /(\d{1,2}:\d{2}[ap]m) - (\d{1,2}:\d{2}[ap]m) \((\w+)\)/g; 
 
var times = "7:55am - 9:10am (TR) 8:10am - 9:00am (W)"; 
 
while ((m=regexStr.exec(times)) !== null) { 
 
\t finalArr.push([m[1], m[2], m[3]]); 
 
} 
 
console.log(finalArr);