使用正则表达式定位多个嵌套的If语句

时间:2010-05-30 04:05:07

标签: c# java regex static-analysis

有没有办法在代码中使用正则表达式搜索多个嵌套的if语句?

例如,一个表达式,它将使用不同的样式(如果/ if,if / elseif / else)找到if语句的三个或更多层的实例:

if (...) {
    <code>
    if (...) {
        <code>
        if (...)
            <code>
    } else if (...) {
        <code>
    } else {
        <code>
    }
} else {
    <code>
}

3 个答案:

答案 0 :(得分:3)

使用正则表达式进行源代码搜索是个坏主意。 IMO。最好使用一些解析源代码的工具,然后允许您使用(例如)XPath样式路径表达式查询解析树。

源代码搜索的正则表达式的问题在于它们通常难以读写(除非您是正则表达式大师),并且由于正则表达式创建者的某些边缘情况,它们容易出现误报和漏报没有想到。 (例如,在关键字中使用\ uxxxx字符。)

以下是一些工具链接:

(请随意向其他人推荐。)

答案 1 :(得分:1)

除非,我误解了这个答案,肯定是没有。原因是,如果您必须跟踪嵌套级别,那么您所讨论的语言子集是无法匹配的正则表达式。正则表达式只能识别在确定性有限自动机中捕获的事物。要做这样的事情需要一个堆栈或计数器,它会将你移动到一个更强大的自动机类,称为下推自动机。

答案 2 :(得分:-3)

尝试:

((if\(.+\)(\n)?.*\n|(else)?[ ]*(if\(.+\))?(\{)?(\n)*.*(\n)*(\})?){3}((if\(.+\)(\n)?.*\n|(else)?[ ]*if\(.+\)\{(\n)*.*(\n)*\})*

有点冗长,但它会查找3个或更多语句,这些语句由带有条件和可选大括号的if语句组成,或带有可选条件和可选大括号的else if语句。