用Javascript解析正则表达式如果那么

时间:2017-08-04 00:48:01

标签: javascript regex regex-group

添加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

1 个答案:

答案 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}将导致同样的问题