我花费了大量的时间来尝试在字符串中找到适当的regEx
来选择,只包含未转义的那些元素
自定义分隔符(包括分隔符)。
我的自定义分隔符:
${...}
字符串示例:
此
${ is }
一个明确的${ and simple}
示例${string}
,其中{${only}
}只应选择\ {{highlight}部分。
预期结果:
[“$ {is}”,“$ {and simple}”,“$ {string}”,“$ {only}”]
我已经能够定义正则表达式来选择字符串中的所有标记:
/(\${\s?\S+\s?})/g
然而,我仍然无法弄清楚如何忽略那个可怜的ESCAPED项目,以及${result-4}
我一直在这里进行测试: https://regex101.com/r/XsQFqS/1
我希望对此有任何帮助。
答案 0 :(得分:0)
实际上,使用基本的JavaScript正则表达式似乎不可能只匹配所需的元素。但是,可以使用旧的*SKIP what's to avoid技巧使用捕获组来完成,即What_I_want_to_avoid|(What_I_want_to_match)
,如下所示:
#What_I_want_to_avoid: escaped elemets (odd no. of escape characters)
(?:[^\\]\\(?:\\\\)+|[^\\]\\)\${[^{}]*}
|
#What_I_want_to_match: unescaped element (or even no. of escape characters)
[^\\](?:\\\\)*(\${[^{}]*})
同样,这里的关键思想是完全忽略正则表达式引擎返回的整体匹配:$0
是垃圾桶。相反,我们只需要检查捕获组$1
,它在设置时包含我们要查找的内容。
const regex = /(?:[^\\]\\(?:\\\\)+|[^\\]\\)\${[^{}]*}|[^\\](?:\\\\)*(\${[^{}]*})/g;
const str = `This\${ is }a clear\${ and simple} example \${string}, where {\${only}} only the \\\${highlighted} parts should be selected \\\\\${allowing} escaping and unescaping: \\\\\\\${not}, \\\\\\\\\${yes}`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
m.forEach((match, groupIndex) => {
if(groupIndex && match)
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}