我一直在编写一个正则表达式,允许我匹配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}
我还在学习正则表达式,所以我不知道该怎么做。
答案 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组将不会存在。
说明:
{\?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}".