这是在 Powershell 7.x 中,但我相信这是一个一般的正则表达式问题。
我将一封电子邮件的标题放在一个长字符串中,并希望使用正则表达式通过 Powershell split 函数捕获它们以获得我需要的内容。
看起来像这样:
X-MS-Exchange-Organization-InternalOrgSender: False
Received: from YQBPR0101CA0152.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:e::25)
by YQBPR0101MB5927.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:36::19) with
Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.27; Tue, 8 Aug
2023 03:59:56 +0000
Received: from YQBCAN01FT026.eop-CAN01.prod.protection.outlook.com
(2603:10b6:c01:e:cafe::70) by YQBPR0101CA0152.outlook.office365.com
(2603:10b6:c01:e::25) with Microsoft SMTP Server (version=TLS1_2,
cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6652.27 via Frontend
Transport; Tue, 8 Aug 2023 03:59:56 +0000
所以我希望以单词字符 '(?m)(^\w+)' 开头的每一行都能为我得到。但我也想要之后的一切,直到下一个 ^\w+。我想用 \w+ 捕获的每条额外行都以空格开头,后跟非空格。我认为其中一种环视可能在这里有用,但我似乎无法理解。有什么想法吗?
两个对我来说失败的正则表达式:
'(?sm)(^\w.*(\n\s+.*)+)'
'(?m)(^\w.*(?=(\n\s+.*)*))'
你可以使用
(?m)^(\w.*(?:\n[\s-[\n]].*)*)
详情:
(?m)
- 多行修饰符^
- 任意行的开头(\w.*(?:\n[\s-[\n]].*)*)
- 捕获组#1:
\w.*
- 一个单词字符,然后是除换行字符之外的任何零个或多个字符(尽可能多)(?:\n[\s-[\n]].*)*
- 零次或多次重复换行字符,然后是除换行符之外的任何空格,然后是除换行符之外的任何零个或多个字符(尽可能多)。请参阅 正则表达式演示。