Regex 匹配Powershell中两个单词之间的所有内容

Regex 匹配Powershell中两个单词之间的所有内容,regex,powershell,match,Regex,Powershell,Match,我有一个很大的文本文件,在EXEC-SQL-END-EXEC块之间有SQL查询 我需要EXEC SQL-END-EXEC之间的一切。关键词。下面是输入示例 这就是我想做的。如果有一个EXEC SQL-END-EXEC块,我就能够获取内容。但是,如果存在多个EXEC,则为SQL-END-EXEC。积木,我失败了 a以字符串形式读取文件 对于以字符串形式读取整个文件,我使用 $content = [io.file]::ReadAllText("$pathtofile") $content = $co

我有一个很大的文本文件,在EXEC-SQL-END-EXEC块之间有SQL查询

我需要EXEC SQL-END-EXEC之间的一切。关键词。下面是输入示例

这就是我想做的。如果有一个EXEC SQL-END-EXEC块,我就能够获取内容。但是,如果存在多个EXEC,则为SQL-END-EXEC。积木,我失败了

a以字符串形式读取文件

对于以字符串形式读取整个文件,我使用

$content = [io.file]::ReadAllText("$pathtofile")
$content = $content -replace "\s*`n", " " 

 (p.s. I'm using V2.0 so cannot use -raw option)
b然后我这样做是为了匹配EXEC关键字之间的所有内容

$result = $content -match "EXEC(.*)EXEC"
$matches[0] > D:\result.txt
输入: 您需要使用来确保您的正则表达式分别匹配每个EXEC块。您可以通过单个正则表达式操作收集所有匹配项:

$regex = [regex] '(?is)(?<=\bEXEC SQL\b).*?(?=\bEND-EXEC\b)'
$allmatches = $regex.Matches($subject);
说明:

?不区分大小写匹配,点匹配换行符 ?您需要使用来确保您的正则表达式分别匹配每个EXEC块。您可以通过单个正则表达式操作收集所有匹配项:

$regex = [regex] '(?is)(?<=\bEXEC SQL\b).*?(?=\bEND-EXEC\b)'
$allmatches = $regex.Matches($subject);
说明:

?不区分大小写匹配,点匹配换行符 ?或:

使用多行模式

或:

$script = Get-Content D:\temp\script.sql

$in = $false

$script | %{
    if ($_.Contains("EXEC SQL"))
        { $in = $true }
    elseif ($_.Contains("END-EXEC"))
        { $in = $false; }
    elseif ($in)
        { Write-Host $_ } # Or Out-File ...
}

使用多行模式

可能更容易获取文件中返回字符串数组的内容,然后通过该数组循环并使用简单的状态机自行处理。抱歉,我没有获取它。您是否建议,我应该使用get内容而不是“Readalltext”?请参阅下面的答案。如果您必须以某种方式处理脚本内容,例如格式化,那么这可能是一种比正则表达式更好的方法。这可能更容易在文件上使用“获取内容”(返回字符串数组),然后通过该数组循环并使用简单的状态机自行处理。抱歉,我没有得到它。您是否建议,我应该使用get内容而不是“Readalltext”?请参阅下面的答案。如果您必须以某种方式处理脚本内容,例如格式化,那么这可能是一种比正则表达式更好的方法。
$script = Get-Content D:\temp\script.sql

$in = $false

$script | %{
    if ($_.Contains("EXEC SQL"))
        { $in = $true }
    elseif ($_.Contains("END-EXEC"))
        { $in = $false; }
    elseif ($in)
        { Write-Host $_ } # Or Out-File ...
}