匹配IF代码块之间的内容

时间:2016-01-30 00:31:19

标签: regex powershell

我试图确保某些存储过程不应该有RETURN语句,除了最后一个。对于此任务,我尝试在PowerShell脚本上使用常规表达式。 我的策略是检查每个IF @@ERROR<>0块并在其中执行另一次搜索。如何匹配此SQL查询的每个IF块的内容?

    --Some code here...

        IF @@ERROR<>0
        BEGIN
            RAISERROR('MY ERROR HERE. %s',1,16,@STORE_PROCEDURE_NAME)
            GOTO ROLL
        END

    --More code here...

        IF @@ERROR<>0
        BEGIN
            RAISERROR('ANOTHER ERROR HERE. %s',16,1,@STORE_PROCEDURE_NAME)
            GOTO ROLL
        END 

    --more code here...

IF @@ERROR<>0
BEGIN
    RAISERROR('MAIN ERROR %s',16,1,@STORE_PROCEDURE_NAME)
ROLL:
    ROLLBACK TRANSACTION
    RETURN
END

COMMIT TRANSACTION

2 个答案:

答案 0 :(得分:1)

Select-String与这样的正则表达式一起使用:

IF .*\s+BEGIN([\s\S]*?)END

并从结果中仅选择组:

... | Select-String 'IF .*\s+BEGIN([\s\S]*?)END' -AllMatches |
  Select-Object -Expand Matches |
  Select-Object -Expand Groups |
  Where-Object { -not $_.Groups } |
  Select-Object -Expand Value

正则表达式匹配关键字IF,后跟空格和同一行上的可选其他文本,一个或多个空白字符,关键字BEGIN和最短文本量(非贪婪匹配)直到下一次出现关键字ENDBEGINEND之间的子表达式与括号分组,因此可以从完整匹配中提取。

答案 1 :(得分:0)

使用以下正则表达式/(If @@ERROR<>0\s+BEGIN)(.*?)(end)/sig,我可以获得IF和END之间的内容。请注意,只匹配中间的END,所以实际上匹配某些块的BEGIN的END。

DEMO CODE