添加Regex101网址: https://regex101.com/r/7Pd1ri/1/
我一直在解决这个问题大约3个半小时。
我不能为我的生活弄清楚我做错了什么。我非常接近使其完美运作,但我不知道如何检查{/IF}
的第一次出现
我的注意事项:
{IF\s*([^}]+)}([\s\S]+)(?:{\/ELSE})([\s\S]+){\/IF}
正在解析的文件:
{IF !isLoggedIn}
<a href="/sign-in/">Sign In</a>
{ELSE}
Welcome back, {>username}!<br />
{# students}
<li>{#>last_name}, {#>first_name}</li>
{/#}
{/IF}
{IF isLoggedIn}
Beta Testing...
{/IF}
出于某种原因,正则表达式一直捕获到{/IF}
ELSE
答案 0 :(得分:1)
你的问题是其他块捕获组的贪婪行为:
([\s\S]+)
这意味着获得最大可能的匹配,仍然符合正则表达式的其余部分。
要更改您在?
之后添加+
以使其成为懒惰运算符。现在意味着获得尽可能小的匹配。
你的正则表达式现在是:
{IF\s*([^}]+)}([\s\S]+)(?:{\/ELSE})([\s\S]+?){\/IF}
https://regex101.com/r/7Pd1ri/2
What do lazy and greedy mean in the context of regular expressions?
中此行为的更多详细信息 顺便说一下,你也需要在if块中执行此操作,否则第二个{IF}中的{ELSE}将导致同样的问题