无限循环从DDL获取存储过程名称

时间:2014-12-12 14:36:58

标签: c# sql sql-server regex oracle

我有这个正则表达式来检查DLL是否有一个prodcedure

var expReg = "(((ALTER|CREATE|OR|REPLACE| )*)+)?PROCEDURE.*";    
return (Regex.IsMatch(textProcedure, expReg, RegexOptions.IgnoreCase)

我将它与SQL Server或Oracle DLL一起使用。

有时可行,有时会有无限循环。

有什么问题?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

(X*)+形式的模式在正则表达式中是一个非常糟糕的主意,因为它可能导致catastrophic backtracking。这种模式迫使正则表达式引擎在失败之前尝试所有可能的组合。这可能需要很长时间。

在您的情况下,我认为*不是必需的,只需使用:

(?:ALTER|CREATE|OR|REPLACE|\s)+PROCEDURE

我也删除了?,否则单词PROCEDURE的存在就足以让模式匹配。

这可以进一步简化为:

(?:ALTER|CREATE|REPLACE)\s+PROCEDURE

因为匹配字符串REPLACE PROCEDURE中的CREATE OR REPLACE PROCEDURE就足够了。