我需要两个正则表达式来识别if .. then .. else .. endif
部分及其部分。
从表达式可能如下所示:
示例1:
5 + 10 * (if (4 + 4.5) > 0 then 20 else 45 endif) + 2
示例2:
if (20 == 10) then 10 endif
示例3:
if (20/10 != 2) then (2 * 10) else (3 * 4) endif
预期结果:
一个正则表达式,可以在表达式中给出if..endif
部分
对于前者从示例1开始,我应该单独收到if (4 + 4.5) > 0 then 20 else 45 endif
一个正则表达式,可以给我if..endif
个部分。
对于前者从示例1我应该收到:
左比较者:(4 + 4.5)
接线员:>
右比较者:0
然后部分:20
ElsePart:45
(可以为null或string.Empty)
注意事项:
else
是可选的。if..endif
可能是唯一的表达式,也可能是表达式的一部分。then
& else
可以有表达式或静态值。>, <, ==, !=, >=, <=
答案 0 :(得分:4)
正则表达式不适合这种工作,因为你可以嵌套if
/ then
/ else
并且因为可能的变化(缺少else
, 例如);正则表达式将是巨大的,需要大量的工作来平衡每次捕获的贪婪/懒惰。扫描每个字符并生成一个可以解释的表达式树会容易得多。正则表达式更适合于已知格式或变化很小的文本解析。
修改强>
在考虑之后,并没有那么难:
if( *.*? *)then( *.*? *)(?:else( *.*? *))?endif
每个捕获组都包含以下组件:
else
存在时)我不保证准确性,因为它不适用于嵌套的if
表达式,但是根据您的需要它应该足够了。
答案 1 :(得分:1)
为什么你认为你需要一个正则表达式?在这种情况下,我会编写一个小解析器,例如使用ANTLR。维护复杂表达式的解析器语法通常不如正则表达式那么痛苦,还有一个好处是可以提供带有上下文信息等的更好的错误消息。