用正则表达式读取多行?

时间:2014-09-11 18:56:10

标签: regex powershell

我有一个看起来像这样的文件:

SPECIMEN: Procedure: xxxx1 A) Location: yyyy2
Major zzz B) Location: something
text here C) more


CLINICAL DIAGNOSIS: xyz

换行符为CR,然后为LF

我正在尝试制作从Procedure:末尾读取的正则表达式,直到CLINICAL DIAGNOSIS的开头但读取多行时出现问题。

这就是我所拥有的:

$input_file = 'c:\Path\0240188.txt'
$regex = ‘(?m)^SPECIMEN: Procedure: (.*)CLINICAL DIAGNOSIS:’
select-string -Path $input_file -Pattern $regex -AllMatches | % { $_.Matches } | % { $_.Value }

哪个不会返回任何内容。

如果我将该行更改为:

$regex = ‘(?m)^SPECIMEN: Procedure: (.*)’

它抓住第一线,但不是其余部分。我假设(?m)假设为我抓了多行。

任何提示?

5 个答案:

答案 0 :(得分:1)

(?m)会导致^$个锚点在实现时匹配每行的开头和结尾。您希望使用内联(?s)修饰符强制点匹配所有字符,包括换行符。

$regex = ‘(?s)SPECIMEN: Procedure: (.*)CLINICAL DIAGNOSIS:’

答案 1 :(得分:1)

似乎$ input_file只能逐行读取,这对你没有帮助,

尝试:

$fileContent = [io.file]::ReadAllText("C:\file.txt")

或者

$fileContent = Get-Content c:\file.txt -Raw

取自另一篇文章here

答案 2 :(得分:1)

试试这个:

$regex = '(?ms).*SPECIMEN: Procedure:(.+)CLINICAL DIAGNOSIS: '

Get-Content $input_file -Delimiter 'CLINICAL DIAGNOSIS: '|
 foreach {@($_) -match 'CLINICAL DIAGNOSIS: ' -replace $regex,'$1'}

使用'临床诊断'作为分隔符,无需一次读入所有数据,一次解析/捕获多个匹配。

答案 3 :(得分:0)

试试这个:

$input_file = gc 'c:\Path\0240188.txt' | out-string
# or: gc c:\path\xxxxx.txt -raw  #with v3+
$regex = ‘(?s)\bSPECIMEN: Procedure: (.*?)CLINICAL DIAGNOSIS:’
$input_file | select-string -Pattern $regex -AllMatches | % { $_.Matches }
# or: [regex]::matches($input_file, $regex) # much faster

答案 4 :(得分:0)

你可以使用像这样的小正则表达式技巧:

Procedure:([\S\s]+)CLINICAL DIAGNOSIS

<强> Working demo

enter image description here

由于.匹配除新行之外的所有内容,因此您可以使用[\S\s]+来匹配所有内容,因为图像显示为绿色,并使用捕获组(...)捕获它。如果你想避免使用单行标志,这个技巧就可以了。

相关问题