我有这个正则表达式来检查DLL是否有一个prodcedure
var expReg = "(((ALTER|CREATE|OR|REPLACE| )*)+)?PROCEDURE.*";
return (Regex.IsMatch(textProcedure, expReg, RegexOptions.IgnoreCase)
我将它与SQL Server或Oracle DLL一起使用。
有时可行,有时会有无限循环。
有什么问题?非常感谢任何帮助。
答案 0 :(得分:2)
(X*)+
形式的模式在正则表达式中是一个非常糟糕的主意,因为它可能导致catastrophic backtracking。这种模式迫使正则表达式引擎在失败之前尝试所有可能的组合。这可能需要很长时间。
在您的情况下,我认为*
不是必需的,只需使用:
(?:ALTER|CREATE|OR|REPLACE|\s)+PROCEDURE
我也删除了?
,否则单词PROCEDURE
的存在就足以让模式匹配。
这可以进一步简化为:
(?:ALTER|CREATE|REPLACE)\s+PROCEDURE
因为匹配字符串REPLACE PROCEDURE
中的CREATE OR REPLACE PROCEDURE
就足够了。