1

我正在尝试查找存储过程文件中调用的存储过程的所有名称。有效的存储过程调用是:

call my_stored_procedure(param1, param2)

我的策略 [基于我有限的正则表达式知识] 是寻找类似于以下内容的独特事件:调用 my_stored_procedure(

例外情况是在“调用”之前在行首有双破折号“--”注释的那些。

我的想法是,一旦我得到上面的字符串,我可以通过使用“call”和“(”作为我在一些后期处理中所做的分隔符来找到实际的存储过程名称。

在存储过程文件中,此调用可能有多种变体。每个完整单词之间可以有多个空格和/或制表符。

call     my_stored_procedure(param1, param2)
        call     my_stored_procedure(param1, param2)
call my_stored_procedure  (param1, param2)
call my_stored_procedure  (
 param1, param2)
call my_stored_procedure  ( param1, param2 )
-- call my_stored_procedure  (param1, param2)
--call my_stored_procedure  (param1, param2)
--call my_stored_procedure
-- jsmith call my_stored_procedure  (param1, param2)

我正在使用 ASP.Net Regex 引擎,到目前为止,这就是我所拥有的:

Regex rgxFindStoredProcedures = new Regex(@"(?<!.*--? *)(call|CALL)\s*([A-Za-z0-9-_\.]+)(\s*)\(", RegexOptions.Multiline | RegexOptions.IgnoreCase);

上面的正则表达式似乎有效,我找到了所有匹配项并排除了前 3 个已注释掉的调用。但是,它包括最后评论的电话:

-- jsmith call my_stored_procedure  (param1, param2)

有没有人知道如何过滤掉最后一个注释掉的电话?我的想法是在里面设置一个条件

(?<!.*--? * some_condition_here)

如果 -- 不等于“call”之后有单词,它会丢弃匹配,但我不太清楚如何为这种情况构建正则表达式。

任何帮助是极大的赞赏。

4

2 回答 2

3

只需使用start-of-line anchor^。还,

  • callCALL您已经指定IgnoreCase.
  • 假设call必须是一行中的第一个标记,您可以跳过后视
  • 您不需要转义句点,因为它已经在字符类中
  • 您可以为与 proc 名称匹配的部分命名,并使用 Match.Groups 属性获取它
string pattern = @"^\s*call\s*(?<ProcName>[A-Za-z0-9_.]+)(\s*)\(";
var rx = new Regex(pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);
foreach(var m in rx.Matches(yourInput))
    Console.WriteLine(m.Groups["ProcName"].Value); 
于 2012-11-12T21:34:27.420 回答
0

这是一个应该做你想做的事情的正则表达式。

^(?<!--.*?)\s*call\s+[A-Za-z0-9-_\.]+\s*\(

它与示例文本中的前五个调用相匹配。

于 2012-11-12T21:34:48.820 回答