Regex Powershell-多行正则表达式拆分
我试图做的是获取一个sql脚本块并去掉“GO”语句 我想我已经创建了一个合适的正则表达式<代码>(?smi)(.*)^GO$;因为它看起来在这里工作: 下面是我目前拥有的powershell脚本;但我没有得到我期望的结果。我似乎在整个输入上得到了一个大匹配;而不是2场比赛;每个表示GO分隔符内的语句。你知道我这里错了什么吗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
#$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$”
应该能满足您的需求