如何在Ruby中使用正则表达式匹配嵌套的if语句块
Ruby正则匹配嵌套最外层if语句块解决方案
问题根源
你当前使用的正则采用非贪婪匹配(.|\n)*?,扫描到第一个{/if}时就会终止匹配,无法识别嵌套的if层级,因此无法命中最外层对应的结束标签。
解决方案
Ruby正则支持递归匹配,你可以使用如下正则表达式实现需求:
\{#if.*?\}(?>[^{}]+|\{(?!#if|\/if\})|(?R))*\{\/if\}
正则逻辑拆解
\{#if.*?\}:匹配最外层的if起始标签,非贪婪匹配条件内容,避免过度吞噬后续字符(?>...):原子组,禁止不必要的回溯,提升匹配效率[^{}]+:匹配所有不包含大括号的普通文本内容\{(?!#if|\/if\}):匹配不属于if起始/结束标签的大括号内容,避免误判标签边界(?R):递归套用整个正则的匹配规则,处理嵌套的if语句块
\{\/if\}:匹配最外层对应的if结束标签
调用示例
template = <<~TEMPLATE {#if x > 10} <p>{x} is greater than 10</p> {#if 5 > x} <p>{x} is less than 5</p> {/if} {/if} TEMPLATE if_block_regex = /\{#if.*?\}(?>[^{}]+|\{(?!#if|\/if\})|(?R))*\{\/if\}/ outer_if_block = template.match(if_block_regex)[0] puts outer_if_block
运行后输出的就是完整的最外层if语句块。
内容的提问来源于stack exchange,提问作者sjsc
相关产品推荐
相关产品推荐

