如何从这个Powershell正则表达式脚本中仅提取6位数字?

时间:2015-02-19 17:37:10

标签: powershell

我有以下Powershell脚本:

$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} }

这给了我一个像这样的输出:

Request 123456
Request 223456
Request 443456
Request 923456
....

但是我想只获得6位数字(来自其中包含“请求”的子喷射线)。

这是我试过的,我试图再次管道结果:

$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} } | % {$RESULT=[Regex]::Match($_.TaskSubject, "\d{6}"); if($RESULT.Success){$RESULT.Value}}

但是我收到了这个错误:

ForEach-Object : Cannot bind parameter 'Process'. Cannot convert the "{ $RESULT=[Regex]::Match($_.TaskSubject, "\d{6}")
; if($RESULT.Success){$RESULT.Value} }" value of type "System.String" to type "System.Management.Automation.ScriptBlock
".
At line:1 char:120
+ $sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject, "Request\s\d{6}"); if($RESULT.Success){$RESULT.Value}} |
 % <<<<
    + CategoryInfo          : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand

3 个答案:

答案 0 :(得分:2)

我认为在该行末尾传输的$Result项将丢失TaskSubject属性标头。鉴于我认为这会更好。

$sentMail.Items | %{ $RESULT=[Regex]::Match($_.TaskSubject ,"Request\s\d{6}"); if($RESULT.Success){$RESULT.Value} } |%{$Result=[regex]::Match($_,"\d{6}"); if($RESULT.Success){$RESULT.Value}}

或者你可以跳过第二个Regex并使用split方法。

%{$_.split(" ")[1]}

答案 1 :(得分:1)

第二个示例的问题基于代码块和括号放置。尝试使代码可读并将其放在多行上,您将看到我的意思。

至于你接近你想要的第一个代码:如果你不想在结果中返回“请求”,你应该只能使用非捕获组

$sentMail.Items | % { $RESULT=[Regex]::Match($_.TaskSubject ,"(?:Request\s)\d{6}"); if($RESULT.Success){$RESULT.Value} }

<强>更新

显然非捕获不能按预期工作,所以我们使用后面的代码,因为它实现了相同的目标。更新了逻辑以处理结果。

$sentMail.Items | %{[Regex]::Match($_.TaskSubject,'(?<=Request\s)\d{6}')} | ?{$_.Success} | %{$_.value}

<强>输出

123456
223456
443456
923456

答案 2 :(得分:1)

我也会在这里回答一下,因为我在另一个问题的回复评论中回答了这个问题。我要做的是将电子邮件传递到Where语句中,该语句匹配主题行中的6位数(除非您实际使用的是Outlook Task对象,它应该与TaskSubject相同),然后将其传递到ForEach循环中吐出自动生成的$Matches变量。像这样:

$sentMail.Items | Where { $_.Subject -match "(\d{6})" } | ForEach { $Matches[1] }

我还在我的RegEx匹配中指定了用括号括起指定数据它应该捕获6位数。这对您的示例来说并不是非常有用,但是,例如,如果您需要明确包含该主题:

请求######

并且您只想捕获您要做的6位数字 - 匹配&#34;请求(\ d {6})&#34;。如果您的电子邮件中包含“已完成######”的主题,则可以使用此功能。在文件夹中也是您不想捕获的。