使用 Javascript IF THEN ELSE 解析正则表达式

Parsing regex with Javascript IF THEN ELSE

添加 Regex101 URL: 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

的正文

你的问题是else块捕获组的贪婪行为:

([\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} 会导致同样的问题