2016-07-08 17 views
-1

Я сделал RegExp для форматирования строки входящей даты, но с моим использованием она не работает должным образом. Я надеялся, что кто-то может объяснить, почему нет:Почему этот RegExp не работает должным образом?

var data = [ 
 
    "m_2013_01_01", 
 
    "m_2013_02_01", 
 
    "m_2013_03_01", 
 
    "m_2013_04_01" 
 
]; 
 

 
// why aren't these equivalent? 
 
// expected 
 
console.log(data.map(datum => datum.replace(/^m_(\d+)_(\d+)_(\d+)/g, '$1-$2-$3'))); 
 
// ??? 
 
console.log(data.map(datum => datum.replace(/^m_(?:(\d+)_?){3}$/g, '$1-$2-$3')));

+1

Вы никогда не должны использовать кванторы на захват группы, если вы на самом деле хотите, чтобы использовать их в любом случае, так как только последнее совпадение этой группы на самом деле хранится. –

ответ

5

В кулаке Regex вы используете 3 группы:

Regular expression visualization

Именно поэтому вы можете ссылаться на группу 1, 2 и 3.

Однако во втором регулярном выражении вы используете 1 группу, повторенную несколько раз, поэтому группа 2 и 3 не существуют и не могут быть ссылки:

Regular expression visualization

+0

Whoa! Откуда у вас эти контрольные потоки? –

+3

@PatrickRoberts вы можете получить его с https://www.debuggex.com/ –

+0

Это действительно полезно, спасибо! –

Смежные вопросы