我试图找到存储过程文件中调用的存储过程的所有名称。有效的存储过程调用是:
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;之后有单词,则会丢弃匹配但是我无法弄清楚如何为这种情况构建正则表达式。
非常感谢任何帮助。
答案 0 :(得分:3)
只需使用start-of-line anchor ^
即可。另外,
call
时,无需同时包含CALL
和IgnoreCase
。 call
必须是某一行的第一个令牌,您可以跳过后瞻性的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*\(
它匹配示例文本中的前五个调用。