【问题标题】:Parsing regex with Javascript IF THEN ELSE [duplicate]用 Javascript IF THEN ELSE 解析正则表达式 [重复]
【发布时间】:2017-08-04 00:48:01
【问题描述】:

添加 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 的主体

【问题讨论】:

  • 这是什么语言?
  • 它的自定义。我正在尝试让 REGEX 解析 IF ELSE。
  • 关于语言的问题是相关的。有各种正则表达式引擎,它们的语法和功能都不同。您使用的正则表达式的风格是完全相关的,并且回答的能力需要那个细节。如果您已经编写了自己的正则表达式引擎(其自定义),那么您需要将其提供给这里的所有人或自己解决问题。
  • (1) 你需要了解贪心匹配和非贪心匹配的区别。 (2) 你写这个模板引擎的目的是什么?如果是出于爱好或学术目的,那很好。但除此之外,我强烈建议您采用现成的解决方案,例如车把或 nunjucks。
  • “由于某种原因,正则表达式一直捕获到第二个 {/IF} 请参阅 {IF\s* RegExp。预期的结果是什么?

标签: javascript regex regex-group


【解决方案1】:

你的问题是 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} 会导致同样的问题

【讨论】:

  • 效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多