Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Powershell-多行正则表达式拆分_Regex_Powershell - Fatal编程技术网

Regex Powershell-多行正则表达式拆分

Regex Powershell-多行正则表达式拆分,regex,powershell,Regex,Powershell,我试图做的是获取一个sql脚本块并去掉“GO”语句 我想我已经创建了一个合适的正则表达式(?smi)(.*)^GO$;因为它看起来在这里工作: 下面是我目前拥有的powershell脚本;但我没有得到我期望的结果。我似乎在整个输入上得到了一个大匹配;而不是2场比赛;每个表示GO分隔符内的语句。你知道我这里错了什么吗 #$fileContent = [io.file]::ReadAllText("C:\temp\script.sql") $fileContent = @" GO IF NO

我试图做的是获取一个sql脚本块并去掉“GO”语句

我想我已经创建了一个合适的正则表达式<代码>(?smi)(.*)^GO$;因为它看起来在这里工作:

下面是我目前拥有的powershell脚本;但我没有得到我期望的结果。我似乎在整个输入上得到了一个大匹配;而不是2场比赛;每个表示GO分隔符内的语句。你知道我这里错了什么吗

#$fileContent = [io.file]::ReadAllText("C:\temp\script.sql")
$fileContent = @"
GO
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'MyTable' 
                and COLUMN_NAME = 'NewColumn')   
        BEGIN
            ALTER TABLE MyTable 
            ADD NewColumn bit not null DEFAULT(0)
        END
go
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'AnotherTable' 
                and COLUMN_NAME = 'AnotherNewColumn')   
        BEGIN
            ALTER TABLE AnotherTable 
            ADD AnotherNewColumn bit not null DEFAULT(0)
        END
GO
"@
$matchInfo = $fileContent | Select-String '(?smi)(^.*?)^GO$' -AllMatches
注意,
(?m)GO$
将仅在字符串或仅以LF结尾的行的末尾匹配
GO
。您需要在
$
之前添加
\r?
,以匹配LF和CRLF结尾

您可以使用获取并打印捕获的子字符串(位于组1中)

请注意访问组1内存缓冲区的
$\.Groups[1].value
。匹配项是使用
$\uu0.value
访问的。您可以根据需要对结果执行任何操作,而不是打印。

您可以尝试以下方法:

$a = [regex]::Matches($fileContent,  '(?smi)(^GO.*?END)')
$a[0]。捕获[0]。值给出:

GO
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'MyTable' 
                and COLUMN_NAME = 'NewColumn')   
        BEGIN
            ALTER TABLE MyTable 
            ADD NewColumn bit not null DEFAULT(0)
        END
go
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'AnotherTable' 
                and COLUMN_NAME = 'AnotherNewColumn')   
        BEGIN
            ALTER TABLE AnotherTable 
            ADD AnotherNewColumn bit not null DEFAULT(0)
        END
$a[1]。捕获[0]。值给出:

GO
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'MyTable' 
                and COLUMN_NAME = 'NewColumn')   
        BEGIN
            ALTER TABLE MyTable 
            ADD NewColumn bit not null DEFAULT(0)
        END
go
    IF NOT EXISTS  (select 1 
                from INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'AnotherTable' 
                and COLUMN_NAME = 'AnotherNewColumn')   
        BEGIN
            ALTER TABLE AnotherTable 
            ADD AnotherNewColumn bit not null DEFAULT(0)
        END

您至少需要
(?smi)(.*?^GO\r?$
来解释CRLF结尾。请尝试
[regex]::匹配($fileContent),(?smi)(.?^GO\r?$)|%{“匹配:$($).Groups[1].value)`n--匹配结束--
。你期待什么比赛?@WiktorStribiżew;将其作为答案发布;似乎正在解决我的问题为什么
选择字符串
绕道
$fileContent-替换“(?sm)^GO$”
应该能满足您的需求