试用和失败超过一个小时后的正则表达式问题

时间:2015-08-31 13:37:00

标签: regex

我有以下正则表达式

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}} 是否存在

所有的帮助都会很棒,一直在敲打这个。

Regex Demo

2 个答案:

答案 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}}

Demo

您基本上滥用了延迟量词并使(成为可选项,因此空格与\s+?右侧的\(匹配。

{{else}}部分是错误的,因为您使此令牌的每个组件彼此独立可选。我将其分组为一个可选组。

另外,请帮自己一个忙,并使用x选项来获得更长的模式。

更进一步,我认为这种模式需要进一步重组:

{{
  (?P<expression>if|IF)
  \s+\(\s*(?P<statement>.*?)\s*\)\s*
}}
\s*(?P<then>.*?)\s*
(?:
  {{else}}
  \s*(?P<else>.*?)\s*
)?
{{endif}}

Demo

现在,您获得了三个捕获组:statementthenelse