powershell - 使用正则表达式提取两者之间的值

时间:2015-06-23 06:41:01

标签: regex powershell

我尝试在Outlook MSG中提取2个部分之间的内容:

A部分:

XXXXXXXXXXXXXX

B部分:

XXXXXXXXXXXXXX

C部分:

我正在使用正则表达式"(?sm)part A:(.*?)part C:"。我这样做是因为一些msg没有part B:。有没有办法从输出中删除/排除part B:内容?非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

是的,在您想要捕获的块之后添加一个单独的捕获块(Part B: .*?)?。如果您的消息包含" B部分"。

,则此块仅包含数据
PS K:\> $t="Part A: blabla Part B: bla Part C: bla"
PS K:\> $regex="(?ms)Part A: (.*?)(Part B:.*?)?Part C:"
PS K:\> $t -match $regex
True
PS K:\> $matches

Name                           Value
----                           -----
2                              Part B: bla
1                              blabla
0                              Part A: blabla Part B: bla Part C:


PS K:\> $tt="bla Part A: no wai Part C: here"
PS K:\> $tt -match $regex
True
PS K:\> $matches

Name                           Value
----                           -----
1                              no wai
0                              Part A: no wai Part C:

答案 1 :(得分:0)

类似于Vespers的回答。我也会使用$matches,因为你想要提取两个部分。我将使用named matches和一个略有不同的正则表达式模式。

$pattern = "(?sm)part A:(?<betweenAB>.*?)\s+part B:(?<betweenBC>.*?)part C:"
If($msg -match $pattern){
    "{0}{1}" -f $matches.betweenAB, $matches.betweenBC 
}

$msg会包含您邮件的内容,或者如果您使用的是Outlook com对象,则可以将$msg.Body放置到位。 ?<capturename>是您使用命名匹配的方式,以便您可以引用$matches对象中的匹配属性。我还添加了一个\s+来删除示例文本中应该跳过的新行之一。

您还可以看到此处使用的-f format operator