0

我一直在处理我们的应用程序中的一些遗留代码,这些代码使用 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 的任一侧是否有空格(或换行符),但我无法完全弄清楚正则表达式的语法。

有什么建议么?

4

2 回答 2

0

看看这个网站: http:
//www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

注意以下几行:

\s 匹配任何空格,包括空格、制表符、换页符等。等效于“[ \f\n\r\t\v]”。
[^xyz] 否定字符集。匹配任何未包含的字符。例如,“[^abc]”匹配“plain”中的“p”。

所以.....
[\s]+[[WITH]|[with][\s]+[[^AS]|[^as]]* 分解它:
[\s]+ 是任何一个上的空格边
[[with]|[WITH][ 不区分大小写检查 with
[[^AS]|[^as]]* 不区分大小写的检查将匹配只要 AS 或不存在
希望这有帮助

于 2012-07-27T18:14:59.457 回答
0

尽管这不是一个真正的答案,但我发现更简单的方法是在我们的存储过程中强制执行一些命名约定规则并修改违反规则的 20 左右。

确实,这是 Regex 不是解决方案的情况!

于 2012-08-15T09:54:09.150 回答