我有以下正则表达式
URL
要匹配以下内容:
/{{(?P<expression>if|IF)\s+?\(?\s+?(?P<statement>.*)\s?\)\s+?}}\s+?(?P<output>.*)\s+?{?{?(?P<statement2>else)?}?}?\s+?(.*)\s+{{endif}}/gmi
然而由于某种原因,在“声明”中以某种方式捕获括号和多余空格中的一个
它也不应该关心{{if (\RAD\Security::Version() != 1.0 ) }}
<p>Sorry you do not have the latest version installed...</p>
{{else}}
<p>Yay</p>
{{endif}}
{{if (\RAD\Security::Version() != 1.0 ) }}
<p>Sorry you do not have the latest version installed...</p>
<p>Yay</p>
{{endif}}
是否存在
所有的帮助都会很棒,一直在敲打这个。
答案 0 :(得分:1)
以下是您可以使用的内容:
{{
(?P<expression>if)
\s*\(\s*
(?P<statement>.*)
\s*\)\s*}}\s*
(?P<output>.*)
\s*
(?: # start of optional {{else}}
{{
(?P<statement2>else)
}}\s*
)? # end
(.*)
\s+
{{endif}}
请参阅demo,此处为verbose regex version。
我将\s+?
替换为\s*
,因为您希望匹配可选空格,并使用非{{else}}
的非捕获组将整个?
部分设置为可选(1或0次)量词。
请注意,使用(if|IF)
没有意义,因为您已经拥有一个i
修饰符,使模式不区分大小写。
答案 1 :(得分:1)
这是一个固定版本:
{{
(?P<expression>if|IF)
\s+\(\s*(?P<statement>.*?)\s*\)\s*
}}
\s*(?P<output>.*?)\s*
(?:{{(?P<statement2>else)}})?
\s*(.*?)\s*
{{endif}}
您基本上滥用了延迟量词并使(
成为可选项,因此空格与\s+?
右侧的\(
匹配。
{{else}}
部分是错误的,因为您使此令牌的每个组件彼此独立可选。我将其分组为一个可选组。
另外,请帮自己一个忙,并使用x
选项来获得更长的模式。
更进一步,我认为这种模式需要进一步重组:
{{
(?P<expression>if|IF)
\s+\(\s*(?P<statement>.*?)\s*\)\s*
}}
\s*(?P<then>.*?)\s*
(?:
{{else}}
\s*(?P<else>.*?)\s*
)?
{{endif}}
现在,您获得了三个捕获组:statement
,then
和else
。