如何在Powershell中提取正则表达式反向引用/匹配的值

时间:2009-03-05 12:57:51

标签: regex powershell

我有一个包含数据行的文本文件。我可以使用以下的powershell脚本来提取我感兴趣的行:

select-string -path *.txt -pattern "subject=([A-Z\.]+),"

一些示例数据将是:

blah blah subject=THIS.IS.TEST.DATA, blah blah blah

我想要的是能够仅提取主题的实际内容(即“THIS.IS.TEST.DATA”字符串)。我试过这个:

select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0] }

但“匹配”属性始终为null。我做错了什么?

9 个答案:

答案 0 :(得分:10)

我不知道为什么你的版本不起作用。它应该工作。这是一个有用的丑陋版本。

$p = "subject=([A-Z\.]+),"
select-string -path *.txt -pattern $p | % {$_ -match $p > $null; $matches[1]}

编辑。 dant的说明:

-match是正则表达式匹配运算符:

>"foobar" -match "oo.ar"
True

> $null只是禁止将True写入输出。 (尝试删除它。)有一个cmdlet执行同样的事情,我现在不记得这个名字。

$matches是一个魔术变量,用于保存上一次-match操作的结果。

答案 1 :(得分:4)

在PowerShell V2 CTP3中,实现了Matches属性。所以以下内容将起作用:

select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0].Groups[1].Value }

答案 2 :(得分:3)

又一个选择

gci *.txt | foreach { [regex]::match($_,'(?<=subject=)([^,]+)').value }

答案 3 :(得分:2)

您键入的代码的问题是select-string不会传递实际的Regex对象。相反,它传递一个名为MatchInfo的不同类,它没有实际的正则表达式匹配信息。

如果你只想运行一次正则表达式,你将不得不滚动你自己的功能,这不是太困难。

function Select-Match() {
  param ($pattern = $(throw "Need a pattern"), 
         $filePath = $(throw "Need a file path") )
  foreach ( $cur in (gc $filePath)) { 
    if ( $cur -match $pattern ) { 
      write-output $matches[0];
    }
  }
}

gci *.txt | %{ Select-Match "subject=([A-Z\.]+)," $_.FullName }

答案 4 :(得分:2)

从所有其他答案中学到了很多东西后,我能够通过以下方式得到我想要的东西:

gci *.txt | gc | %{ [regex]::matches($_, "subject=([A-Z\.]+),") } | %{ $_.Groups[1].Value }

这感觉很好,因为我每行只运行一次正则表达式,当我在命令提示符下输入它时,很高兴不使用多行代码。

答案 5 :(得分:1)

请参阅Regular expressions in PowerShell

上的这些说明

答案 6 :(得分:1)

Select-String命令似乎返回 MatchInfo 变量而不是“string”变量。 我花了几个小时在论坛和官方网站上发现这一点,没有运气。 我还在收集信息。 解决这个问题的方法是从您的示例中明确声明一个字符串变量来保存从Select-String返回的结果:

[string] $ foo = select-string -path * .txt -pattern“subject =([A-Z。] +),”

$ foo变量现在是一个字符串而不是MatchInfo对象。

希望这有帮助。

ps5 powershell版本5字符串字符串操作

答案 7 :(得分:1)

选择字符串有一个更简单的替代方法,它会更好地工作。

在powershell中,

  1. $sample="blah blah subject=THIS.IS.TEST.DATA, blah blah blah"
  2. $sample -match "subject=([A-Z\.]+),"
  3. $matches[1]将包含您要查找的子字符串。

这适用于Windows 10.0.16299版本

答案 8 :(得分:0)

另一种变体,匹配字符串中的7位数

echo "123456789 hello test" | % {$_ -match "\d{7}" > $null; $matches[0]}

返回:1234567