正则表达式在PLSQL中提取函数

时间:2013-08-04 19:35:34

标签: regex

我想从plsql源文件中提取函数内容。典型的功能看起来像这样

FUNCTION func_name;            // this could be there in the files

FUNCTION func_name
IS
   var_   Varchar2(100);
BEGIN
   InitSecurity('func_name')
   IF xxx THEN
      BEGIN
          xxxxx
      END;
   END IF;
END func_name;

我遇到的问题是可能有几个BEGIN& END嵌套在main函数中。有没有办法提取这整个功能,记住这一点?

1 个答案:

答案 0 :(得分:1)

如果您可以假设函数的END始终位于行的开头而没有缩进,而所有其他函数都缩进,则此正则表达式将在中设置为多线模式(标记m与大多数正则表达式引擎)。您还需要“点匹配所有内容”标记(s)。

FUNCTION\s+[a-z0-9_]+\s+IS\s+(.+?)^END

这里的诀窍是^END,它告诉它只匹配一行开头的END。 ^锚点仅在多行模式中具有的含义,因此如果您的正则表达式引擎需要它,请确保添加m标志(Ruby的那个没有,其他大多数人都这样做)。

分别捕获定义和代码:

FUNCTION\s+[a-z0-9_]+\s+IS\s+(.+?)\s+BEGIN\s+(.+?)^END

如果您始终在“END”语句中提供函数的名称,就像您在编辑中所做的那样,那么无论缩进如何,此正则表达式都将起作用。您需要“点匹配所有内容”标记(s)。

FUNCTION\s+([a-z0-9_]+)\s+IS\s+(.+)\s+END\s+\1\s*;

这里我使用的是反向引用:END\s+\1\s*;将匹配END,后跟至少一个空格,后跟函数的名称(先前捕获),后跟任意数量的空格和分号。

分别捕获定义和代码:

FUNCTION\s+([a-z0-9_]+)\s+IS\s+(.+?)\s+BEGIN\s+(.+)\s+END\s+\1\s*;

如果您无法对缩进做出假设,并且所有函数在“END”语句中都没有其名称,那么我就无法想到能够完成这项工作的正则表达式。

当涉及到递归模式时,正则表达式通常不是正确的工具(嗯,在某些高级正则表达式引擎中有一种方法可以递归整个模式,但它并不适用于所有模式并且很难使用)

所以我会用手工做。循环遍历字符,检测函数的开头(你可以使用一个简单的正则表达式),然后为每个“BEGIN”增加一个计数器,并为每个“END”减少它(小心不要用“END IF”递减) )。当计数器降至零时,这就是你功能的结束。