我一直在处理我们的应用程序中的一些遗留代码,它们通过使用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
/*-------------------------------------------------------------------------
我希望在AS关键字之前找到关键字WITH 时匹配,但它会允许存储过程的名称或参数中的单词。
我认为检测可行的方式是,如果关键字WITH在其两侧都有空格(或换行符),但我无法弄清楚正则表达式语法。
有什么建议吗?
答案 0 :(得分:0)
查看此网站:
http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet
注意以下几行:
\ s匹配任何空格,包括空格,制表符,换页符等。相当于“[\ f \ n \ r \ t \ v]”。
[^ xyz]负字符集。匹配任何未包含的字符。例如,“[^ abc]”匹配“plain”中的“p”。
所以.....
[\ S] + [[带] | [与] [\ S] + [[^ AS] | [^作为]] *
故障:
[\ s] +是两边的空白
[[with] | [WITH] [不区分大小写检查与
[[^ AS] | [^ as]] *不区分大小写的检查,只要AS或不存在就匹配
希望这可以帮助
答案 1 :(得分:0)
即使这不是一个真正的答案,我发现更简单的方法是在我们的存储过程中强制执行一些命名约定规则并修改违反规则的大约20个。
事实上,当Regex不是解决方案时就是这种情况!