2016-08-30 3 views
-2

Предположим, следующий код:.match в JavaScript не работает как задумано

"ab00ab____ab01ab".match(/ab(.+)ab/); 

Я хочу, чтобы это получить меня 00 и 01, но вместо этого он возвращает мне это:

["ab00ab____ab01ab", "00ab____ab01"] 

Как я могу исправить эту проблему?

+0

[Как в этой теме] (http://stackoverflow.com/questions/39200657/how-do-you-match-valid-integers-and-roman-numerals-with-a-regular-expression?noredirect= 1 # comment65741443_39200657), я обязан прокомментировать, что просто доступ к группам захвата не фиксирует текущую проблему, и вопрос не может быть закрыт с помощью [* Регулярные выражения JavaScript и группы захвата *) (http://stackoverflow.com/questions/ 33621271/JavaScript-регулярные выражения-и-захват-групп). –

+0

Отвечает ли мой ответ на проблему? –

ответ

1

Использования RegExp#exec внутри цикла с /ab(.+?)ab/g регулярным выражением:

var s = "ab00ab____ab01ab"; 
 
var re = /ab(.+?)ab/g; 
 
var res = []; 
 
while ((m=re.exec(s)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

Прежде всего, вам нужен шаблон ленивым соответствия точки (.*? или .+?), чтобы совпасть к первому ab , не жадный (.+) совпадение до последних ab. Кроме того, с String#match и регулярным выражением с глобальным модификатором вы теряете все захваты (те подстроки, которые совпадают с частями шаблона регулярного выражения в скобках), вы можете использовать их только с RegExp#exec.

+0

Ваш код не работает, цикл while никогда не заканчивается. –

+0

@MarioAlexandroSantini: Вы ошибаетесь, потому что мое регулярное выражение не соответствует пустой строке. После каждого успешного совпадения свойство 'lastIndex' класса RegExp автоматически продвигается. Если совпадения нет, 'm' равно * null *. –

+0

Проблема не в том, что у вас есть пустая строка. В этом случае вы просто пропустите время. Я думал, что * re.exec() * всегда соответствует результатам в бесконечном цикле. Во всяком случае, ваш код опасен, как если бы вы удалили флаг * g * из регулярного выражения, у вас есть бесконечный цикл. –