正则表达式捕获存储过程定义

时间:2012-05-23 18:33:30

标签: ruby regex

我有一个定义了存储过程的文件,如下所示:

CREATE        PROCEDURE [XXXX].[procedure_name_here]

到目前为止我的正则表达式是:

\.\[.*\]+.*

参考:http://rubular.com/r/Z0FiI78bqF

我需要一些帮助,因为它似乎没有100%正确。

注意:[xxxx]。 part可能存在也可能不存在(可选),但是CREATE必须在那里,否则它将是调用存储过程的另一个存储过程,我只是在寻找实际的定义。

2 个答案:

答案 0 :(得分:2)

如果您可以在点之后立即依赖方括号之间的过程名称,那么您可以写

\.\[(.*?)\]

括号将为您捕获过程名称字符串。

如果点是可选的,或者您需要更多验证该行是过程定义,请使用

CREATE\s+PROCEDURE\s+(?:\[.*?\]\.)?\[(.*?)\]

答案 1 :(得分:-1)

SQL不是常规语言。这意味着无法使用正则表达式正确解析它。当然可以为SQL编写正确的解析器,并且可以为您关心的SQL子集编写正确的解析器。但只有正则表达式才能这样做。

您可以使用正则表达式作为猜测。但是,根据正则表达式的选择,你会得到两个误报,其中正则表达式表示某些文本是有效的SQL而不是错误,并且是否定的,其中正则表达式表示某些文本在实际上是无效的SQL完全有效。

所以你留下来:要么为SQL编写正确的解析器,要么编写一个能够做出最佳猜测的正则表达式 - 并确保编写所有SQL文件以传递该正则表达式。