我正在编写一个模板引擎,我的语法如下:
{{If "{{Line}}" != ""}}
{{If "{{Line}}" != ""}}
<li id="{{Required:Id}}" class="menuEntry line">
{{EndIf}}
<li id="{{Required:Id}}" class="menuEntry line">
{{EndIf}}
现在,我正在搜索正则表达式以获取我的if语句,这意味着从{{If
到{{EndIf}}
之间的所有内容都应包括在内。
我想出了正则表达式:
/({{If)[.]*?[\s\S]*?({{EndIf}})/g
当我只有1个if语句时,这确实可行,但是对于嵌套的if语句,它会出错。
上面的正则表达式会给我:
{{If "{{Line}}" != ""}}
{{If "{{Line}}" != ""}}
<li id="{{Required:Id}}" class="menuEntry line">
{{EndIf}}
事实上,我期待检索:
{{If "{{Line}}" != ""}}
<li id="{{Required:Id}}" class="menuEntry line">
{{EndIf}}
任何可以在这里为我提供指导的人吗?
答案 0 :(得分:1)
(\{\{If)((?:(?!\{\{If \"\{\{Line\}\}\" \!= \"\"\}\}|\{\{EndIf\}\}).)*)?(\{\{EndIf\}\})/sg
试试这可能会对你有所帮助
答案 1 :(得分:0)
除了使用匹配所有内容的.*?
(包括{{If
),您可以使用与{{If
之外的所有内容匹配的否定前瞻:(?!.*{{If)
。
你的正则表达式(你可以test it here):
/{{If(?!.*{{If).*?{{EndIf}}/gs
由于Javascript没有 dotall 修饰符s
以允许点也匹配换行符,因此您可以使用类及其否定而不是.
(如所解释的) here)。然后你正则表达式(测试它here):
/{{If(?![\s\S]*?{{If)[\s\S]*?{{EndIf}}/g
答案 2 :(得分:0)
在JavaScript中,您可以尝试:
}}\s+({{If [\s\S]*?{{EndIf}})
从索引1获取匹配的组
这是DEMO
以下是代码:
var myString = '...';
var myRegexp = /}}\s*({{If [\s\S]*?{{EndIf}})/gi;
var match = myRegexp.exec(myString);
alert(match[1]);