RegExp子模式重用用于不同的开闭条件?

时间:2015-05-16 23:56:03

标签: javascript regex node.js

是否可以为包含模式的各种开启和关闭条件重用匹配的RegExp子模式?

我有一个特定表达式X的复杂/长RegExp子模式,我希望它存在于任何开放式语句中,定义为:${...},{{1} },$(...)$[...]等,这些组合使得整个模式(混合开放条件不被接受,或者它本来是微不足道的。)

我想要的是避免在定义整个模式时为每个开闭条件(使用$/.../)重复相同的长X子模式,因为它变得太长且不可读,即使它大多只是重复X子模式。

我的问题 - 这是否可以在|语法中实现?如果是,那怎么样?

环境:ES5为0.12节点,ES6为IO.js 2.0。

P.S。严格地说,我们在这里讨论RegExp优化,以获得更好的代码可读性,以及可能的性能。

1 个答案:

答案 0 :(得分:2)

在一起使用时,您可以使用极其笨拙的方式匹配特定的开合括号:

\$(?:(\[)|(\()|({)|(\/)).*?(?:(?=\2)(?=\3)(?=\4)\]|(?=\1)(?=\3)(?=\4)\)|(?=\1)(?=\2)(?=\4)}|(?=\1)(?=\2)(?=\3)\/)
                        ^^^ Inner Match Here

它基本上查找除了一个特定组之外的所有组都是空的,并且恰好只能在JavaScript正则表达式中工作。上面代码中指出的.*?部分只需要替换为在大括号内匹配的正则表达式,以匹配任意模式。

演示:https://regex101.com/r/aX7rH1/1

// Matches
${...}
$(...)
$[...]
$/.../
// Does Not Match
${...)
${...]
${.../
$(...}
$(...]
$(.../
$[...}
$[...)
$[.../
$/...}
$/...)
$/...]