我有一个包含文本中的名字和姓氏的字符串,如下所示:
"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'
。
我如何获得所有匹配的字符串?
答案 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