匹配if / elseif / else语句和正则表达式

时间:2014-09-27 11:17:37

标签: javascript regex

我一直在编写一个正则表达式,允许我匹配if / elseif / else语句。在Stack Overflow社区的帮助下,我已尽可能地(匹配if / else语句)。

这是我想要匹配的内容:

{?if gender = male}You're a guy!{?elseif gender = female}You're a gal!{?else}{#gender|capitalise}{?endif}

(我的目标是允许无限制的“elseif”语句,最好。)它还需要能够匹配以下内容,以确保它向后兼容:

{?if gender = male}Male{?else}Female{?endif}
{?if gender != female}{#gender}{?endif}

我正在寻找的输出:

0: gender = male
1: You're a guy!
2: {?elseif gender = female}You're a gal!
3: {#gender|capitalise}

数字2应该在同一个字符串中包含每个elseif,以允许它们之后被拆分和处理,如:

2: {?elseif gender = female}You're a gal!{?elseif this = that}Output (...)

我当前的正则表达式很接近,但还不够好。

{\?if ([^{}]+)}(.+?)(?:{\?else}(.+?))?{\?endif}

我还在学习正则表达式,所以我不知道该怎么做。

2 个答案:

答案 0 :(得分:2)

不确定这是否符合"答案",但由于您正在编写模板,为什么不使用模板语言,其中大约有一千个。即使您需要自定义/扩展它们,这也比编写和维护一堆意大利面条更容易。

{{#if gender = 'male'}}You're a guy!
    {{elsif gender = 'female'}}You're a gal!
    {{else}}{{gender|capitalise}
{{/if}}

上面是一个松散地模仿车把的虚构模板语言。

如果您没有找到满足您需求的现有模板语言,或者可以轻松地进行调整,那么这些引擎的实现应该为如何编写解析器提供一些灵感。

答案 1 :(得分:1)

它不支持嵌套语句,但请尝试:

{\?if ([^{}]+)}(.*?)({\?elseif [^{}]+}.*?)*(?:{\?else}(.+?))?{\?endif}

如果没有{?elseif}语句,第2组将捕获空字符串。 如果没有{else}声明,第3组将不会存在。

See demo.

说明:

{\?if // match "{?if " literally
([^{}]+)// capture the condition in group 0
}// match "}"
(.*?)// capture the content of the {if} branch in group 1
(// in group 2,...
   {\?elseif //...capture "{?elseif "...
   [^{}]+//...a condition...
   }//..."}"...
   .*?// and the content of the {elseif} branch...
)*//...as often as possible.
(?:// if possible,...
   {\?else}//...match "{?else}"...
   (.+?)//...and the content of the {else} branch.
)?
{\?endif}// finally, match "{?endif}".