C#Regex:在过程文件中查找对其他存储过程的所有调用

时间:2012-11-12 20:58:31

标签: c# asp.net regex comments

我试图找到存储过程文件中调用的存储过程的所有名称。有效的存储过程调用是:

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)

如果在 - 不等于&#34;呼叫&#34;之后有单词,则会丢弃匹配但是我无法弄清楚如何为这种情况构建正则表达式。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

只需使用start-of-line anchor ^即可。另外,

  • 当您指定call时,无需同时包含CALLIgnoreCase
  • 假设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); 

答案 1 :(得分:0)

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

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

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