我需要解析电子邮件模板以获取在成对的美元符号之间出现的自定义变量,例如:
$foo$bar$baz$foo$bar$baz$wtf
因此,我想从上面的'foo'中提取出来,因为它位于第一对(第一和第二对)美元符号之间。然后跳过“ bar”,但是提取“ baz”,因为它位于下一对货币符号(第3对和第4对)之间。
我能够使用split
和filter
如下所示完成此操作,但是我想知道,是否有办法用正则表达式来完成相同的操作?我认为可以使用某种形式的正式解析器(递归或其他方式),但是在我看来,这似乎有点过头了
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);