Я использую это выражение:регулярного выражения в JavaScript соответствует слишком много
"g{field1}={field2}a".match(/{([^\{\}]+)\}/g)
Что мне нужно, чтобы получить «field1» и «поле2», но он возвращает массив с «{field1}» и "{field2}".
Я использую это выражение:регулярного выражения в JavaScript соответствует слишком много
"g{field1}={field2}a".match(/{([^\{\}]+)\}/g)
Что мне нужно, чтобы получить «field1» и «поле2», но он возвращает массив с «{field1}» и "{field2}".
Вы можете использовать exec
, которые могут возвращать несколько групп, захватив на матчи.
var re = /{([^\{\}]+)\}/g,
matches = [],
input = "g{field1}={field2}a",
match;
while (match = re.exec(input)) matches.push(match[1]);
console.log(matches);
Вы также можете повторно написать регулярное выражение (здесь это зависит от того, что строка ввода может быть):
var matches = "g{field1}={field2}a".match(/{([^}]+)}={([^}]+)}/).slice(1);
console.log(matches);
Не знал, что я могу использовать совпадение несколько раз в одной строке. Это просто очень элегантно. –
@ArnaudWeil 'exec' заставит регулярное выражение отслеживать индекс последнего совпадения, так как это свойство' lastIndex'. Однако убедитесь, что вы используете «exec», как показано с помощью * глобального * флага, или у вас будет бесконечный цикл;) – plalx
Downvote, действительно? Было бы неплохо узнать, почему я могу исправить любое неверное утверждение. – plalx
Если вы просто хотите, массив без фигурных скобок, вы можете использовать метод карты массива:
"g{field1}={field2}a".match(/{([^\{\}]+)\}/g).map(function(i){return i.slice(1,-1)})
Это то, что подразумевал Doorknob, и это решение. Я disapointed JS regexps не делают этого, но это решение в любом случае. –
"g{field1}={field2}a".match(/([^g=a\{\}]+)/g)
возвращает
["field1", "field2"]
Err ... кроме того, что он не будет работать ни на какой другой вход !!! Я мог бы также использовать ["field1", "field2"] hardcoded в этом случае ... –
Правда, слишком быстро с этим ответом :-( –
Вы можете использовать предпросмотр
"g{field1}={field2}a".match(/[^\{\}]+(?=\})/g)
это будет соответствовать любому символу, который не {
или }
, если согласованный набор символов сопровождается }
Вы также можете сделать:
'g{field1}={field2}a'.split(/[{}]/).filter(function(a,i){return i%2;});
при условии, что строка всегда содержит соответствие «{ } ". Существует также:
'g{field1}={field2}a'.split(/^[^{]*\{|\}[^{]*\{|\}[^{]*$/g).slice(1,-1);
, оба из которых будут работать на любом количестве {...} пар (от 0 до n).
Поскольку регулярные выражения JS не имеют lookbehinds, просто удалите первый и последний символ строк – Doorknob
Что вы имеете в виду, Doorknob? –
Проверка наличия символа перед определенным совпадением без соответствия символу не поддерживается в регулярных выражениях JS. ([подробнее] (http://www.regular-expressions.info/lookaround.html)) Вместо этого просто возьмите каждую строку и удалите первый и последний символы. – Doorknob