RegExp子模式重用的不同的开闭条件?
是否有可能重用一个匹配的RegExp
子模式的包含模式的各种打开和closures条件?
对于某个expression式X,我有一个复杂的/长的RegExp
子模式,我希望这个模式存在于任何一个打开closures语句中,定义为: ${...}
, $(...)
, $[...]
, $/.../
等,这些组合使得整个模式(混合开闭条件不被接受,或者它将是微不足道的)。
我想要避免在定义整个模式时为每个开关条件(使用|
)重复相同的长X子模式,因为它变得太长而且不可读,即使它大部分只是重复X个子模式,模式。
我的问题 – 在RegExp
语法中可以实现吗? 如果是,那么如何?
环境:ES5的节点0.12,ES6的IO.js 2.0。
PS严格地说,我们正在谈论RegExp
优化,以获得更好的代码可读性,以及可能的性能。
在一起使用时,您可以使用非常不寻常的方式匹配特定的开启和closures括号:
\$(?:(\[)|(\()|({)|(\/)).*?(?:(?=\2)(?=\3)(?=\4)\]|(?=\1)(?=\3)(?=\4)\)|(?=\1)(?=\2)(?=\4)}|(?=\1)(?=\2)(?=\3)\/) ^^^ Inner Match Here
它基本上查找所有组,除了一个特定的一个是空的,碰巧只能在JavaScript正则expression式。 .*?
在上面的代码中指出的部分只需要用大括号内的正则expression式来replace,以匹配任意的模式。
演示: https : //regex101.com/r/aX7rH1/1
// Matches ${...} $(...) $[...] $/.../ // Does Not Match ${...) ${...] ${.../ $(...} $(...] $(.../ $[...} $[...) $[.../ $/...} $/...) $/...]