可以使用正则表达式来查找定界符对之间的文本吗

Could a regular expression be used to find text between pairs of delimiters

我需要为出现在美元符号对之间的自定义变量解析电子邮件模板,例如:

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

所以我想从提取上面的 'foo' 开始,因为它位于第一对(第 1 和第 2)美元符号之间。然后跳过 'bar' 但提取 'baz',因为它位于下一对(第 3 和第 4)美元符号之间。

我能够使用 splitfilter 完成此操作,如下所示,但我想知道,是否有一种方法可以使用正则表达式来完成同样的操作?我假设可以使用某种正式的解析器,无论是递归的还是其他的,但在我看来这似乎有点矫枉过正

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

只需匹配正则表达式中的定界符两次

const body = "$foo$bar$baz$foo$bar$baz$wtf";
const result = body.match(/$[^$]*$/g).map(s => s.replace(/$/g, ''));
console.log(result);

您可以使用此正则表达式 /$\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);

您可以在正则表达式中使用 capturing group

const str1 = '$foo$bar$baz$foo$bar$baz$wtf';
const regex1 = /$(\w+)$/g;

const str2 = '*foo*bar*baz*foo*bar*baz*wtf';
const regex2 = /\*(\w+)\*/g;

const find = (str, regex) =>
  new Array(str.match(regex).length)
  .fill(null)
  .map(m => regex.exec(str)[1]);

console.log('delimiters($)', JSON.stringify(find(str1, regex1)));
console.log('delimiters(*)', JSON.stringify(find(str2, regex2)));