.NET正则表达式识别`if .. then .. else .. endif`

时间:2010-09-04 20:25:01

标签: c# regex

我需要两个正则表达式来识别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

预期结果:

  1. 一个正则表达式,可以在表达式中给出if..endif部分 对于前者从示例1开始,我应该单独收到if (4 + 4.5) > 0 then 20 else 45 endif

  2. 一个正则表达式,可以给我if..endif个部分。 对于前者从示例1我应该收到:

  3. 左比较者:(4 + 4.5)
    接线员:>
    右比较者:0
    然后部分:20
    ElsePart:45(可以为null或string.Empty)

    注意事项:

    1. else是可选的。
    2. if..endif可能是唯一的表达式,也可能是表达式的一部分。
    3. then& else可以有表达式或静态值。
    4. 可以在if条件中使用的条件运算符是>, <, ==, !=, >=, <=
    5. 正则表达式应该在 C#应用程序中工作。

2 个答案:

答案 0 :(得分:4)

正则表达式不适合这种工作,因为你可以嵌套if / then / else并且因为可能的变化(缺少else , 例如);正则表达式将是巨大的,需要大量的工作来平衡每次捕获的贪婪/懒惰。扫描每个字符并生成一个可以解释的表达式树会容易得多。正则表达式更适合于已知格式或变化很小的文本解析。

修改

在考虑之后,并没有那么难:

if( *.*? *)then( *.*? *)(?:else( *.*? *))?endif

每个捕获组都包含以下组件:

  1. 条件
  2. 真值
  3. false的值(仅当else存在时)
  4. 我不保证准确性,因为它不适用于嵌套的if表达式,但是根据您的需要它应该足够了。

答案 1 :(得分:1)

为什么你认为你需要一个正则表达式?在这种情况下,我会编写一个小解析器,例如使用ANTLR。维护复杂表达式的解析器语法通常不如正则表达式那么痛苦,还有一个好处是可以提供带有上下文信息等的更好的错误消息。