我一直在处理我们的应用程序中的一些遗留代码,这些代码使用 Regex 检测 SQL 存储过程文本中的某些关键字,但由于我对 Regex 的了解有限,我发现了一个无法完全纠正的错误。
基本上,我目前拥有的正则表达式适用于所有情况,但只有一种情况:
(?<=\n\s*)(?<!with.*[\s\S]*)as
它应该在这个版本的存储过程上返回一个匹配项:
ALTER PROCEDURE [dbo].[p_obj_name_with_something]
@username [nvarchar](100) = null,
@id [int] = null,
@mode [int] = 0
AS
/*-------------------------------------------------------------------------
但是它不应该用于这个版本,但它目前确实返回了一个匹配项:
ALTER PROCEDURE [dbo].[p_obj_name_with_something]
@username [nvarchar](100) = null,
@id [int] = null,
@mode [int] = 0
WITH EXECUTE AS CALLER
AS
/*-------------------------------------------------------------------------
当关键字 WITH未在 AS 关键字之前找到时,我想要一个匹配项,但它将允许存储过程的名称或参数中的单词。
我认为检测将起作用的方式是关键字 WITH 的任一侧是否有空格(或换行符),但我无法完全弄清楚正则表达式的语法。
有什么建议么?