获取两个表达式之间的所有匹配项

Get all matches in between two expressions

我有一些文本我想操作并替换其中的一些行,但是我在获取我需要的所有匹配项时遇到了一些问题。我只想匹配第二个文本块中的行。有些数字可能会改变,但 GRP 200 和 GRP 300 是固定的。

示例文本:

SAR - GRP 200 T 0.300000 MNO 1 MRF 2 DRX 0.000000 0.000000 -1.000000 NX -1.000000 0.000000 0.000000 H1 0.15
SARB OUT
 SLNB X1 0.00000000 -6.00000000 2.00000000 X2 0.00000000 -6.00000000 2.10000000
SARB OUT
 SLNB X1 0.00000000 -6.00000000 2.10000000 X2 0.00000000 6.00000000 2.10000000
SARB OUT
 SLNB X1 0.00000000 6.00000000 2.10000000 X2 0.00000000 6.00000000 2.00000000
SARB OUT
 SLNB X1 0.00000000 6.00000000 2.00000000 X2 0.00000000 -6.00000000 2.00000000

SAR - GRP 200 T 0.300000 MNO 1 MRF 2 DRX 0.000000 0.000000 -1.000000 NX -1.000000 0.000000 0.000000 H1 0.15
SARB OUT
 SLNB X1 0.00000000 -6.00000000 0.00000000 X2 0.00000000 -6.00000000 2.00000000
SARB OUT
 SLNB X1 0.00000000 -6.00000000 2.00000000 X2 0.00000000 6.00000000 2.00000000
SARB OUT
 SLNB X1 0.00000000 6.00000000 2.00000000 X2 0.00000000 6.00000000 0.00000000
SARB OUT
 SLNB X1 0.00000000 6.00000000 0.00000000 X2 0.00000000 -6.00000000 0.00000000

SAR - GRP 300 T 0.600000 MNO 1 MRF 2 DRX 0.000000 0.000000 -1.000000 NX 0.000000 -1.000000 0.000000 H1 0.15
SARB OUT
 SLNB X1 0.00000000 3.00000000 1.80000000 X2 0.00000000 3.00000000 0.00000000
SARB OUT
 SLNB X1 0.00000000 3.00000000 0.00000000 X2 -2.45000000 3.00000000 0.00000000
SARB OUT
 SLNB X1 -2.45000000 3.00000000 0.00000000 X2 -0.30000000 3.00000000 1.80000000
SARB OUT
 SLNB X1 -0.30000000 3.00000000 1.80000000 X2 0.00000000 3.00000000 1.80000000

SAR - GRP 300 T 0.600000 MNO 1 MRF 2 DRX 0.000000 0.000000 -1.000000 NX 0.000000 1.000000 0.000000 H1 0.15
SARB OUT
 SLNB X1 0.00000000 -3.00000000 1.80000000 X2 0.00000000 -3.00000000 0.00000000
SARB OUT
 SLNB X1 0.00000000 -3.00000000 0.00000000 X2 -2.45000000 -3.00000000 0.00000000
SARB OUT
 SLNB X1 -2.45000000 -3.00000000 0.00000000 X2 -0.30000000 -3.00000000 1.80000000
SARB OUT
 SLNB X1 -0.30000000 -3.00000000 1.80000000 X2 0.00000000 -3.00000000 1.80000000

SAR - GRP 100 T 0.400000 MNO 1 MRF 2 NX 0.000000 0.000000 1.000000 H1 0.2 CB 15000 CT 15000
SARB OUT
 SLNB X1 0.00000000 -6.00000000 0.00000000 X2 0.75000000 -6.00000000 0.00000000
SARB OUT
 SLNB X1 0.75000000 -6.00000000 0.00000000 X2 0.75000000 6.00000000 0.00000000
SARB OUT
 SLNB X1 0.75000000 6.00000000 0.00000000 X2 0.00000000 6.00000000 0.00000000
SARB OUT
 SLNB X1 0.00000000 6.00000000 0.00000000 X2 0.00000000 -6.00000000 0.00000000

我想在第二块中匹配与这行相似的4行:

SLNB X1 0.00000000 -6.00000000 0.00000000 X2 0.00000000 -6.00000000 2.00000000 

我试过使用它,但我无法真正理解如何从第二个块中获取所有行:

(?:SAR - GRP 200.+\s+)*?(?:(?:SARB OUT)|(?<!^))*?(SLNB X1.+\s+)(?=SAR - GRP 300.+\s+)

https://regex101.com/r/442mwx/1

我认为这符合您的要求。稍后我可能会在 PowerShell 中尝试一些实验,看看这些行是什么样子的。

我认为它为最后一个 SLNB 行占用了一个额外的行。如果这是一个问题,我们可以将其删除。

(?s).+?SAR - GRP 200.+?SAR - GRP 200.+?(?:SARB OUT.+?(?<SLNB>\s+SLNB.*?))+SAR - GRP 300.*

让我知道这有多接近以及我们需要改变什么。

编辑:

从内到外构建了一个新的 RegEx,从 SLNB 行开始,..?匹配换行符或 return+换行符:

$RegEx = '(?s).*?SAR - .+?(?:SARB OUT..?(?<SLNB> SLNB(?: X\d(?: -?\d+\.\d+){3}){2})..?)+..?SAR - GRP 300.*'

能够在 PowerShell 中对其进行测试,但我认为必须有更简单的代码:

foreach ($item in [Regex]::Matches($SampleText, $RegEx)[0].Groups['SLNB'].Captures) {
    Write-Host "[$($item.Value)]"
}

结果仅匹配 SLNB 行。

[ SLNB X1 0.00000000 -6.00000000 0.00000000 X2 0.00000000 -6.00000000 2.00000000]
[ SLNB X1 0.00000000 -6.00000000 2.00000000 X2 0.00000000 6.00000000 2.00000000]
[ SLNB X1 0.00000000 6.00000000 2.00000000 X2 0.00000000 6.00000000 0.00000000]
[ SLNB X1 0.00000000 6.00000000 0.00000000 X2 0.00000000 -6.00000000 0.00000000]