[英]regex replace only outer brackets of nested parenthesis
更换括号时希望保留内部嵌套括号。 如果可能使许多嵌套层工作会很棒,如果不只是嵌套一次就可以了。
(if money>5 and (times + total_cash >266))[something]
(if times + total_cash >266)[something]
{if money>5 and (times + total_cash >266)}[something]
{if times + total_cash >266}[something]
天真的尝试似乎效果不佳:
str.replace(/\(if(.*?)\)]/gi, '{if $1}')
对于零级嵌套:
str.replace(/\(if\s*([^()]*)\)/gi, '{if $1}')
一级(或更少):
str.replace(/\(if\s*([^()]*(?:\([^()]*\)[^()]*)*)\)/gi, '{if $1}')
两个级别(或更少):
str.replace(/\(if\s*([^()]*(?:\([^()]*(?:\([^()]*\)[^()]*)*\)[^()]*)*)\)/gi, '{if $1}')
等等。这种方法很快就会受到限制。
Javascript 正则表达式不具有递归模式(perl、pcre)或 .net 语言中的计数器系统等功能。 这就是为什么,最好的选择是构建一个 state 机器来计算左括号和右括号的数量(请注意,您可以使用正则表达式将字符串拆分为有趣的部分来执行此操作,例如: str.split(/(\bif\b|[()])/i)
)。
请注意, [^()]*(?:\([^()]*\)[^()]*)*
是一种优化的编写方式: (?:[^()]|\([^()]*\))*
(更短但效率低)。 此子模式已展开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.