Regex powershell-使用正则表达式提取中间值

Regex powershell-使用正则表达式提取中间值,regex,powershell,Regex,Powershell,我尝试在Outlook MSG的两个部分之间提取内容: A部分: XXXXXXXXXXXXX B部分: XXXXXXXXXXXXX C部分: 我使用的是正则表达式“(?sm)A部分:(.*)C部分:”。我这样做是因为一些msg没有B部分:。是否有办法从输出中删除/排除第B部分:内容?非常感谢您的帮助。是的,您可以在想要捕获的块之后添加一个单独的捕获块,其中包含(第B部分:.*?)。只有当您的邮件有“Part B”时,此块才会有数据 类似于晚祷的回答。我也会使用$matches,因为您希望提取两个

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

A部分:

XXXXXXXXXXXXX

B部分:

XXXXXXXXXXXXX

C部分:


我使用的是正则表达式
“(?sm)A部分:(.*)C部分:”
。我这样做是因为一些msg没有B部分:。是否有办法从输出中删除/排除
第B部分:
内容?非常感谢您的帮助。

是的,您可以在想要捕获的块之后添加一个单独的捕获块,其中包含
(第B部分:.*?)
。只有当您的邮件有“Part B”时,此块才会有数据


类似于晚祷的回答。我也会使用
$matches
,因为您希望提取两个部分。我将使用一个稍微不同的regex模式

$pattern=“(?sm)A部分:(?*?)\s+B部分:(?*?)C部分:
如果($msg-匹配$pattern){
“{0}{1}”-f$matches.betweenAB,$matches.betweenBC
}
$msg
将包含您的邮件内容,或者如果您使用的是Outlook com对象,则可以将
$msg.Body
放置到位
是如何使用命名匹配项,以便可以引用
$matches
对象中的匹配属性。我还加入了一个
\s+
,以删除示例文本中应该跳过的一个换行符


您也可以在这里看到所使用的

您可以显示预期的输出吗?输出是我标记X的内容。您需要获得
$matches[1]
才能获得所需的值。最后,添加示例,可能来自给您带来问题的文件。谢谢您的回答。我设法用正则表达式解决了它,并替换了它。它可能不整洁,但结果是我所期望的
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: