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

m1m5dgzv  于 2023-01-14  发布在  其他
关注(0)|答案(3)|浏览(188)

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

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

我已经能够创建两个模式来匹配第一步中的开关主体和第二步中的大小写标签和主体,但是我正在寻找一个单一的正则表达式,它将允许我提取大小写标签和主体。
我们没有嵌套开关。
此致,

qqrboqgw

qqrboqgw1#

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

z4iuyo4d

z4iuyo4d2#

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

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

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

slsn1g29

slsn1g293#

Chas. Owens的评论是正确的。但是对于简单的情况,你可以使用下面的正则表达式:

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

要使用它,你正在使用的正则表达式引擎应该支持显式的多个命名捕获和look-aheads(如.NET正则表达式引擎).注意,除了命名组之外,所有组都可以设置为非捕获,但为了使正则表达式更容易理解,我没有在组开始处添加“?:“来使它们成为非捕获组.
然后,您将通过以下捕获为每个识别的switch语句获取一个匹配项:

  • 表达式:用于开关的表达式(1次捕获)
  • case:case标签,默认为空(但捕获成功)
  • body:案例主体,每个案例一个

case和body总是成对出现,这样您就可以通过捕获进行枚举。

相关问题