2009-05-26 428 views
0

我们需要根据一些业务规则识别并处理代码中的switch/case语句。
匹配Switch Case语句的正则表达式

一个典型的开关语句:

switch (a)
{
case "A":
case "B":
result = "T";
result1 = "F";
default: result = "F";
}

我已经能够创建两个模式的开关体在第一步骤和case标签和身体在第二步匹配,但是我寻找一个单一的正则表达式,这将允许我提取案例标签和身体。

我们没有嵌套开关。

亲切的问候,

+0

你的情况包括条件或循环吗?即使是一个字符串也会导致问题。真的没有办法使用解析器。 – 2009-05-26 15:45:46

回答

3

由于switch语句可以被嵌套传统的正则表达式不能处理它们(赫克,甚至是一个事实,即{}可以嵌套中断它们)。正则表达式只能解析Regular Languages。您需要某种形式的解析器来解析不常规的语言。根据你使用的语言(它看起来像C,但是做了很多事情),可能已经有了一个你可以使用的解析器(例如C的Sparse)。

+0

嗨, 我们没有嵌套开关。 – 2009-05-26 14:51:19

1

下面是一些开始,但它远非完美 - 表达式不识别默认值和switch语句的结尾(也可能包含一些其他错误)。

(?sn:(case (?<label>[^:]+):[ \r\n\t]*)+(?<body>((?!case).)*)) 

UPDATE

如果体内含有case作为字符串或标识符的一部分也将失败。

0

查斯。欧文斯在他的评论中是正确的。但对于简单的情况下,你也许可以使用下面的正则表达式:

switch\s*\((?<expression>[^\)]+)\)\s*\{\s*((default(?<case>)|case\s*(?<case>"[^"]*"|'[^']*'|\w+))\s*:\s*(?<body>((?!\s*(case\b|default\b|\}))("[^"]*"|'[^']*'|[^\}]))*)\s*)+\} 

要使用它,你应该使用明确支持多个命名的捕获和查找aheads(如.NET正则表达式引擎)的正则表达式引擎。请注意,除命名组以外的所有组都可以设为非捕获组,但为了使正则表达式更易于理解,我没有在组开始处添加“?:”以使它们成为非捕获组。

然后,您会得到一个与下面捕获比赛为每一个认可switch声明:

  • 表达:用于开关(1个捕获)表达

  • 情况:案件标签,或空的(但成功捕获)默认为

  • 机身:机身,每个机身一个

情况和身体将始终成对,以便您可以通过捕获进行枚举。