使用`-match`提取两个字符串

时间:2015-12-08 20:58:22

标签: regex powershell

我正在尝试解析字符串:

helo identity email@test.com Pass (v=spf1)

使用-match如下:

$line -match "helo identity (?<sender>.*) (?<heloresult>.*) (v=spf1)"

我认为这会回来:

$matches['sender'] = "email@test.com"
$matches['heloresult'] = "Pass"

但是,它会返回$false

值得注意的是,以下内容符合预期:

$line -match "helo identity (?<sender>.*) Pass"
PS C:\> $matches
Name                           Value
----                           -----
sender                         email@test.com
0                              helo identity email@test.com Pass

我错误地分配这两部分是什么意思?

2 个答案:

答案 0 :(得分:3)

绕过最后一个v = spf1部分的捕获括号,使它们成为字面括号。使用反斜杠逃脱,正则表达式转义字符。

PS C:\temp> 'helo identity email@test.com Pass (v=spf1)' -match 'helo identity (?<Sender>.*) (?<HeloResult>.*) \(v=spf1\)'
True

PS C:\temp> $Matches.Values
email@test.com
Pass
helo identity email@test.com Pass (v=spf1)

答案 1 :(得分:2)

将我的评论转换为requested的答案:

()正则表达式中的特殊字符。必须使用反斜杠转义字面括号。您的案例中正确的RegEx将是:

helo identity (?<sender>.*) (?<heloresult>.*) \(v=spf1\)