是否可以使用正则表达式来查找分隔符对之间的文本



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

$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);

您可以在正则表达式中使用捕获组。

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)));

最新更新