【问题标题】:Infinite loop getting stored procedure name from DDL [closed]从DDL获取存储过程名称的无限循环[关闭]
【发布时间】:2015-02-11 07:09:14
【问题描述】:

我有这个正则表达式来检查 DLL 是否有程序

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

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

有时有效,有时有无限循环。

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

【问题讨论】:

标签: c# sql sql-server regex oracle


【解决方案1】:

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

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

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

我也删除了?,否则仅仅存在PROCEDURE这个词就足以匹配模式。

这可以进一步简化为:

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

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

【讨论】:

  • 谢谢卢卡斯。您发送了一个解决方案,以及我的常规表达不佳的原因。我认为您的解决方案可以帮助一些人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 2015-06-07
  • 2018-07-05
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多