2015-12-08 54 views
0

我試圖解析字符串:使用-match使用`提取兩個字符串-match`

helo identity [email protected] Pass (v=spf1) 

如下:

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

我認爲這將返回:

$matches['sender'] = "[email protected]" 
$matches['heloresult'] = "Pass" 

但是,它返回$false

值得關注的是以下按預期工作:

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

我在做什麼錯誤分配這兩個部分?

+2

我想你應該逃避'括號(V = SPF1)'正確的正則表達式是:'HELO標識( *( *?)? )\(v = spf1 \)' – fardjad

+2

我同意@fardjad,您應該將其作爲答案發布。 – briantist

回答

2

談到我的意見爲答案requested

()正則表達式的特殊字符。文字括號必須用反斜槓進行轉義。在你的情況下,正確的正則表達式是:

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

謝謝!這工作! https://gist.github.com/mbrownnycnyc/4ed056431664575a0a77 – mbrownnyc

3

在最後一個v = spf1零件周圍繞過捕獲圓括號,使它們成爲文字圓括號。使用反斜線即正則表達式轉義字符進行轉義。

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

PS C:\temp> $Matches.Values 
[email protected] 
Pass 
helo identity [email protected] Pass (v=spf1) 
相關問題