我们需要根据一些业务规则识别并处理代码中的switch / case语句。
典型的开关声明:
switch (a)
{
case "A":
case "B":
result = "T";
result1 = "F";
default: result = "F";
}
我能够在第一步中创建两个模式以匹配开关主体,在第二步中创建案例标签和主体,但是我正在寻找一个允许我提取案例标签和主体的正则表达式。
我们没有嵌套开关。
亲切的问候,
答案 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将始终成对出现,以便您可以枚举捕获。