常规表达:忽略转义的项目(Javascript)

时间:2018-05-17 21:43:49

标签: javascript regex

我花费了大量的时间来尝试在字符串中找到适当的regEx来选择,只包含未转义的那些元素 自定义分隔符(包括分隔符)。

我的自定义分隔符

  

${...}

字符串示例

  

${ is }一个明确的${ and simple}示例${string},其中{${only}}只应选择\ {{highlight}部分。

预期结果

  

[“$ {is}”,“$ {and simple}”,“$ {string}”,“$ {only}”]

我已经能够定义正则表达式来选择字符串中的所有标记:

  

/(\${\s?\S+\s?})/g

然而,我仍然无法弄清楚如何忽略那个可怜的ESCAPED项目,以及${result-4}

中返回的额外braket

我一直在这里进行测试: https://regex101.com/r/XsQFqS/1

我希望对此有任何帮助。

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,它在设置时包含我们要查找的内容。

Test Demo

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