正则表达式模式匹配Switch Case语句

时间:2009-05-26 14:35:04

标签: regex

我们需要根据一些业务规则识别并处理代码中的switch / case语句。

典型的开关声明:

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

我能够在第一步中创建两个模式以匹配开关主体,在第二步中创建案例标签和主体,但是我正在寻找一个允许我提取案例标签和主体的正则表达式。

我们没有嵌套开关。

亲切的问候,

3 个答案:

答案 0 :(得分:3)

由于switch语句可以嵌套,传统的正则表达式无法处理它们(即使是{}可以嵌套的事实也会破坏它们)。正则表达式只能解析Regular Languages。您需要某种形式的解析器来解析非常规语言。根据您所使用的语言(它看起来像C,但很多事情也是如此),可能已经有一个可以使用的解析器(例如C的Sparse)。

答案 1 :(得分:1)

这是开始的东西,但它远非完美 - 表达式无法识别默认值和switch语句的结尾(可能还包括其他一些错误)。

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

<强>更新

如果正文包含case作为字符串或标识符的一部分,它也将失败。

答案 2 :(得分:0)

查斯。欧文斯的评论是正确的。但对于简单的情况,您可以使用以下正则表达式:

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

要使用它,您正在使用的正则表达式引擎应该支持显式的多个命名捕获和预测(例如.NET正则表达式引擎)。请注意,除了命名组之外的所有组都可以是非捕获的,但是为了使正则表达式更容易理解,我没有在组启动时添加“?:”以使它们成为非捕获组。

然后,您将获得每个已识别的switch语句的一个匹配项,其中包含以下捕获:

  • 表达式:用于切换的表达式(1个捕获)

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

  • body:case body,每个案例一个

case和body将始终成对出现,以便您可以枚举捕获。

相关问题