如何从此 Powershell 正则表达式脚本中仅提取 6 位数字?
How to extract only the 6-digit number from this Powershell regular-expression script?
我有以下 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 位数字(来自其中包含 "Request" 的子机系列)。
这是我尝试过的,我再次尝试通过管道传输结果:
$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
我认为行尾的 $Result
项目会丢失 TaskSubject 属性 header。鉴于我认为这会更好。
$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}}
或者您可以跳过第二个正则表达式并使用拆分方法。
%{$_.split(" ")[1]}
第二个示例的问题是基于代码块和括号位置。尝试使代码可读并将其放在多行中,您就会明白我的意思。
至于你接近你想要的第一个代码:如果你不想 return 结果中的 "request" 你应该可以使用非捕获组
$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
我也会在这里抛出一个答案,因为我在对你的另一个问题的回复评论中回答了这个问题。我要做的是将电子邮件通过管道传输到与主题行中的 6 位数字匹配的 Where 语句中(除非您实际使用的是 Outlook 任务对象,这应该与 TaskSubject 一样工作),然后将其通过管道传输到 ForEach 循环中吐出自动生成的 $Matches
变量。像这样:
$sentMail.Items | Where { $_.Subject -match "(\d{6})" } | ForEach { $Matches[1] }
我还在我的 RegEx 匹配中指定,方法是将指定的数据用括号括起来,它应该捕获 6 位数字。这对您的示例不是很有用,但是,例如,如果您需要主题专门包含:
请求######
并且您只想捕获您要匹配的 6 位数字 "Request (\d{6})"。例如,如果您的文件夹中有主题为 'Completed ######' 且您不想捕获的电子邮件,这可能会有所帮助。
我有以下 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 位数字(来自其中包含 "Request" 的子机系列)。
这是我尝试过的,我再次尝试通过管道传输结果:
$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
我认为行尾的 $Result
项目会丢失 TaskSubject 属性 header。鉴于我认为这会更好。
$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}}
或者您可以跳过第二个正则表达式并使用拆分方法。
%{$_.split(" ")[1]}
第二个示例的问题是基于代码块和括号位置。尝试使代码可读并将其放在多行中,您就会明白我的意思。
至于你接近你想要的第一个代码:如果你不想 return 结果中的 "request" 你应该可以使用非捕获组
$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
我也会在这里抛出一个答案,因为我在对你的另一个问题的回复评论中回答了这个问题。我要做的是将电子邮件通过管道传输到与主题行中的 6 位数字匹配的 Where 语句中(除非您实际使用的是 Outlook 任务对象,这应该与 TaskSubject 一样工作),然后将其通过管道传输到 ForEach 循环中吐出自动生成的 $Matches
变量。像这样:
$sentMail.Items | Where { $_.Subject -match "(\d{6})" } | ForEach { $Matches[1] }
我还在我的 RegEx 匹配中指定,方法是将指定的数据用括号括起来,它应该捕获 6 位数字。这对您的示例不是很有用,但是,例如,如果您需要主题专门包含:
请求######
并且您只想捕获您要匹配的 6 位数字 "Request (\d{6})"。例如,如果您的文件夹中有主题为 'Completed ######' 且您不想捕获的电子邮件,这可能会有所帮助。