我正在尝试匹配模板文件中的某组标签.然而,我希望标签能够嵌套在自身中.
我的正则表达式如下:(带/ s)
<!-- START (.*?) -->(.*?)<!-- END \\1 -->
Run Code Online (Sandbox Code Playgroud)
标签示例:
<!-- START yList -->
y:{yList:NUM} |
<!-- START xList -->
x:{xList:NUM}
<!-- END xList -->
<!-- CARET xList -->
<br>
<!-- END yList -->
<!-- CARET yList -->
Run Code Online (Sandbox Code Playgroud)
现在匹配结果将是:
匹配0:
组(0)(全场比赛)
<!-- START yList -->
y
<!-- START xList -->
x
<!-- END xList -->
<!-- CARET xList -->
<br>
<!-- END yList -->
Run Code Online (Sandbox Code Playgroud)
基团(1)
yList
Run Code Online (Sandbox Code Playgroud)
组(2)
y
<!-- START xList -->
x
<!-- END xList -->
<!-- CARET xList -->
<br>
Run Code Online (Sandbox Code Playgroud)
我希望2匹配而不是1匹配,嵌套标签集不匹配.这有可能与正则表达式,或者我应该保持regexing组(2)结果,直到我没有找到新的匹配?
正则表达式不适合解析任意深度的树结构.根据你正在使用的正则表达式的风格,可能会这样做,但不推荐 - 它们很难阅读,也很难调试.
我建议改为编写一个简单的解析器.你所做的是将你的文本分解为一组可能的标记,每个标记都可以由简单的正则表达式定义,例如:
START_TOKEN = "<!-- START [A-Za-z] -->"
END_TOKEN = ...
HTML_TEXT = ...
Run Code Online (Sandbox Code Playgroud)
迭代你的字符串,只要你匹配这些标记,将它们从字符串中拉出来,并将它们存储在一个单独的列表中.执行此操作时,请务必保存令牌内的文本(如果有).
然后,您可以迭代令牌列表,并根据令牌类型创建节点的嵌套树结构,每个节点包含1)原始令牌的文本,以及2)子节点列表.
如果这看起来太复杂,您可能需要查看一些解析器教程.