使用 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} 会导致同样的问题
添加 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} 会导致同样的问题