我试图提出一个regex模式来标识存储过程定义中的参数字符串。考虑到各种各样的可能性,它是相当迟钝的,但这里是我到目前为止所拥有的(为大小写不敏感和单行模式设置了全局标志):
(?:create proc.*?)((?:[@]\w+\s+[A-Za-z0-9_()]+(?:\s*=\s*\S+)?(?:\s*,\s*)?)+)(?:.*?with\s+(?:native_compilation|schemabinding|execute\s+as\s+\S+))?(?:[\s\)]*?as)
我已经用各种存储过程定义设置了几个单元测试——有参数或没有参数,有默认值或没有默认值等等——它似乎在所有情况下都能工作,只有一个例外(到目前为止我已经发现):
CREATE PROCEDURE [dbo].[sp_creatediagram]
(
@diagramname sysname,
@owner_id int = null,
@version int,
@definition varbinary(max)
)
WITH EXECUTE AS 'dbo'
AS
BEGIN
set nocount on
...
显然我希望第一个捕获组捕获所有四个参数。。。
@diagramname sysname,
@owner_id int = null,
@version int,
@definition varbinary(max)
…但是由于某种原因,正则表达式搜索在第二个参数之后停止—特别是在包含默认赋值的参数之后—并且不会继续捕获其余的两个参数。第一个捕获组的结果如下:
@diagramname sysname,
@owner_id int = null,
我一点也不惊讶地知道我已经把这个复杂化了,但我确实觉得我真的很接近了。我想regex引擎的工作方式一定有一些我不太了解的地方。非常感谢您的帮助。非常感谢。
暂无答案!
目前还没有任何答案,快来回答吧!