Можно ли использовать регулярное выражение для поиска текста между парами разделителей - PullRequest
1 голос
/ 14 января 2020

Мне нужно проанализировать шаблон электронной почты для пользовательских переменных, которые встречаются между парами знаков доллара, например:

$foo$bar$baz$foo$bar$baz$wtf

Так что я хотел бы начать с извлечения 'foo' выше, так как он находится между первая пара (1 и 2) знаков доллара. А затем пропустите 'bar', но извлеките 'baz', когда он окажется между следующей парой (3-й и 4-й) знаков доллара.

Я смог выполнить sh с помощью split и filter как ниже, но мне интересно, есть ли способ сделать sh то же самое с помощью регулярного выражения вместо этого? Я предполагаю, что можно использовать какой-то формальный синтаксический анализатор, рекурсивный или другой, но, на мой взгляд, это кажется излишним

const body = "$foo$bar$baz$foo$bar$baz$wtf";
let delimitedSegments = body.split('$');

if (delimitedSegments.length % 2 === 0) {
  // discard last segment when length is even since it won't be followed by the delimiter
  delimitedSegments.pop();
}

const alternatingDelimitedValues = delimitedSegments.filter((segment, index) => {
  return index % 2;
});
console.log(alternatingDelimitedValues);

ВЫВОД: ['foo', 'baz', 'bar']

Код также по адресу: https://repl.it/@dexygen / findTextBetweenDollarSignDelimiterPairs

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Просто дважды сопоставьте разделитель в регулярном выражении

const body = "$foo$bar$baz$foo$bar$baz$wtf";
const result = body.match(/\$[^$]*\$/g).map(s => s.replace(/\$/g, ''));
console.log(result);
1 голос
/ 14 января 2020

Вы можете использовать это регулярное выражение /\$\w+\$/g, чтобы получить ожидаемый результат '

let regex = /\$\w+\$/g;

let str = '$foo$bar$baz$foo$bar$baz$wtf';
let result = str.match(regex).map( item => item.replace(/\$/g, ''));
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...