如何在PowerShell中使用正则表达式获取所有匹配字符串的列表?

时间:2015-01-07 08:36:36

标签: regex powershell

我有一个包含文本中的名字和姓氏的字符串,如下所示:

"some text, 'Frances, David', some text, some text, 'Foljevic, Laura', some text, some text, Holjevic, Louis, some text, 'Staples, Cheri', some text"

我想在上面的字符串中获得名称“First, Last”的列表。我正在尝试以下表达式

$Pattern = "'\w*, \w*'" ; $strText -match $Pattern; foreach ($match in $matches) {write-output $match;}

但它只返回第一个匹配的字符串'Frances, David'

我如何获得所有匹配的字符串?

1 个答案:

答案 0 :(得分:2)

-Match运算符会填充不适合的自动变量$Matches。使用正则表达式加速器和MatchCollection之类的,

$mc = [regex]::matches($strText, $pattern)
$mc.groups.count
3
$mc.groups[0].value
'Frances, David'
$mc.groups[1].value
'Foljevic, Laura'
$mc.groups[2].value
'Staples, Cheri'

为什么-Match不能像人们想象的那样工作,the documentation解释道:

  

-Match和-NotMatch运算符自动填充$ Matches   当运算符的输入(左侧参数)是a时变量   单个标量对象。当输入是标量时,-Match和   -NotMatch运算符返回一个布尔值,并将$ Matches自动变量的值设置为参数的匹配组件。

当您传递单个字符串而不是集合时,行为有点令人惊讶。

编辑:

如何替换所有匹配项,请将[regex]::replace()与捕获组一起使用。

$pattern = "'(\w*), (\w*)'" # save matched string's substrings to $1 and $2
[regex]::replace($strText, $pattern, "'`$2 `$1'") # replace all matches with modified $2 and $1

some text, 'David Frances', some text, some text, 'Laura Foljevic', some text, some text, Holjevic, Louis, some text, 'Cheri Staples', some text