2011-01-20 2 views
2

Скажите, что у меня есть строка Hello {{name}}, how are you doing today? Я пытаюсь захватить name из этой строки.A (простой?) Вопрос RegEx для глобальных групп не захвата

До сих пор у меня есть /\{{2}[a-z0-9]*\}{2}/gi. Проблема в том, что он захватывает {{name}}, а не name. Без глобального флага он отлично работает, но я пытаюсь получить каждый экземпляр слов в двойных скобках, так что это не совсем правильно ... Я не RegEx pro, поэтому я надеюсь, что кто-то может мне помочь ...

ответ

4

Лучшее решение будет заключаться в использовании утверждений lookaround, поэтому {{ и }} не подхватываются, однако JavaScript regex не поддерживает lookbehind, он поддерживает только lookahead.

Так одна альтернативы, чтобы поместить текст в захвате группы и захватить то, что внутри:

/\{{2}([a-z0-9]*)\}{2}/gi 

Чтобы получить каждый захват, сделать RegExp объект с регулярным выражением, и перебирать результаты своей exec() функции , Например:

var str = 'Hello {{name}}, how are you doing {{date}}?'; 
var re = /\{{2}([a-z0-9]*)\}{2}/gi; 
var words = []; 
var match; 

while (match = re.exec(str)) { 
    words.push(match[1]); 
} 

jsFiddle sample

Или, как Гамбо говорит в своем комментарии, вручную вырезать {{ и }} из вашего массива спичек.

+2

это было удивительно для меня, но это не работает, как сказал О.П., из-за/г флага. Это в принципе не имеет значения. Я предполагаю, что это из-за того, как javascript обрабатывает регулярные выражения; в perl он будет работать нормально. –

+0

@crimson_penguin: вам нужно запустить 'RegExp.exec()' итеративно, чтобы получить все захваты. – BoltClock

+1

@crimson_penguin: Это не проблема: 'matches.map (function (val) {return val.substring (2, val.length-2);})'. – Gumbo

0

Да, как уже упоминалось, сопоставление с образцом на 2 открытия и закрытия скобки является путь (предполагая, что имя не имеет фигурные скобки в последовательности числа 2 в себе, либо открытие/закрытие)

/\{{2}([a-z0-9]+)*\}{2}/gi

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