可以使用正则表达式来查找定界符对之间的文本吗
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)美元符号之间。
我能够使用 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);
您可以在正则表达式中使用 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)));
我需要为出现在美元符号对之间的自定义变量解析电子邮件模板,例如:
$foo$bar$baz$foo$bar$baz$wtf
所以我想从提取上面的 'foo' 开始,因为它位于第一对(第 1 和第 2)美元符号之间。然后跳过 '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);
您可以在正则表达式中使用 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)));