【发布时间】:2016-04-13 21:53:48
【问题描述】:
所以我查看了How to write a recursive regex that matches nested parentheses? 和其他递归正则表达式匹配的解决方案,但我仍然没有在 RegexBuddy 上得到正确的匹配。
我有一个我想自己解析的通用车把样式模板,一个带有标题的表格:
<table>
<thead>
<tr>
{{#each columns as col }}<th>{{col}}</th>{{/each}}
</tr>
</thead>
<tbody>
{{#each rows as row }}
<tr>
{{#each row as col }}<td>col</td>{{/each}}
</tr>
{{/each}}
</tbody>
</table>
并试图匹配
/{{\#each (\w+) as (\w+) }}(.*?|(?R)){{/each}}/s
正则表达式匹配<thead> 中的{{#each columns... 就好了,但它似乎忽略了|(?R) 部分并且仅匹配{{#each rows... 直到第一个 {{/each}}。当然,我希望它匹配内部和外部 #each 表达式。如何?这可能比简单的嵌套括号复杂得多。
(我一直觉得我是 RegEx 的专业人士,直到我遇到这样的事情。我已经尝试了一段时间来完成这项工作,而正则表达式.info 让我更加困惑。)
我目前正在通过{{#each_sub...}}...{{/each_sub}} 解决此问题,因此我的正则表达式不会在第一个结束标记处停止,但这显然是一种次优的方法。我还有其他几个应用程序可以从递归正则表达式中受益,但无法弄清楚我做错了什么。
【问题讨论】:
-
[^()]*在您链接到的正则表达式中表示不是前导边界也不是尾随边界。因此,您需要像{{#each (\w+) as (\w+) }}(?:(?!{{#each\b[^}]*}}|{{\/each}}).)*(?:(?R)(?:(?!{{#each\b[^}]*}}|{{\/each}}).)*)*+{{\/each}}这样的东西。 -
谢谢@WiktorStribiżew!这正是我想要的。