【问题标题】:Reading in multiple lines with regex?用正则表达式读取多行?
【发布时间】:2014-09-12 04:50:11
【问题描述】:

我有一个如下所示的文件:

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) 应该为我抓取多行。

有什么建议吗?

【问题讨论】:

  • 有什么方法可以将整个文件 slurp 变成一个变量?

标签: regex powershell


【解决方案1】:

试试这个:

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

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

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

【讨论】:

    【解决方案2】:

    $input_file 好像只是逐行读取,在这里对你没有帮助,

    试试:

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

    或者

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

    取自另一个帖子here

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这没有给我任何结果。如果我在您的行中取出CLINICAL DIAGNOSIS:,它最终只会返回SPECIMEN: Procedure: ? 似乎是导致此问题的一部分?
      【解决方案4】:

      试试这个:

      $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
      

      【讨论】:

        【解决方案5】:

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

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

        Working demo

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-11-17
          • 1970-01-01
          • 2017-05-17
          • 1970-01-01
          • 2011-05-29
          • 1970-01-01
          • 2011-04-13
          相关资源
          最近更新 更多