复杂的正则表达式.匹配字符串的一部分未被选中


Complicated regex expression. Part of the match string is left unselected

当前正则表达式:

'('_IF'_'('%([a-zA-Z0-9_]+)'=([a-zA-Z0-9_]+)')'{'s+(.*?)'s+('}')+)
当前输入:

<div class="right-side w-37">
    (_IF_(%verified=1){
        (_IF_(%post_on_profile=1){
            what is going on!!
        })
    })
</div>

看这个演示:http://regex101.com/r/fN2kG5/#debugger

启动调试器,如果还没有启动,点击绿色的线,说"匹配1 - ...."和到底部

您将看到,在代码的最后,字符})与匹配项分开。我不知道我做错了什么,但我需要他们在match字符串。'})'可以多次出现,如'})})'。所以我需要把它们都添加到匹配字符串中

但如何?

谢谢!:)

从正则表达式的末尾删除此('}')+)并替换为以下一个:

('}')'s*)+

它在这里放置了一个可选的空格's*,并与+重复。

您可以在这里使用递归来获得所有关闭的})(如果有的话):

'('_IF'_'('%([a-zA-Z0-9_]+)'=([a-zA-Z0-9_]+)')'{(?:((?R))|[^{}])+'}')

regex101演示

不幸的是,您不能单独使用regex获得所有的变量/值对。但是,您可以在函数中使用上述正则表达式,并递归传递第三个捕获组,直到不再有第三个捕获组。这样,您将获得所有的变量/值对。