添加一个正则表达式101 URL: https://regex101.com/r/7Pd1ri/1/
我已经在解决这个问题大约 3 个半小时了。
我一辈子都无法弄清楚我做错了什么。我非常接近使其完美工作,但我不知道如何检查第一次出现{/IF}
我的正则表达式:
{IFs*([^}]+)}([sS]+)(?:{/ELSE})([sS]+){/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
的主体
您的问题是 else 块捕获组的贪婪行为:
([sS]+)
这意味着获得尽可能大的匹配,仍然遵守正则表达式的其余部分。
要更改它,请在+
后添加?
以使其成为惰性运算符。现在意味着获得尽可能小的匹配。
您的正则表达式现在将是:
{IFs*([^}]+)}([sS]+)(?:{/ELSE})([sS]+?){/IF}
https://regex101.com/r/7Pd1ri/2
有关此行为的更多详细信息,请参阅在正则表达式的上下文中懒惰和贪婪是什么意思?
顺便说一下,你也需要在你的 if 块中这样做,否则你的第二个 {IF} 中的 {ELSE} 会导致同样的问题