来自单个长字符串的多行正则表达式

Multiline regex from single long string

提问人:94jeepyj 提问时间:8/14/2023 最后编辑:94jeepyj 更新时间:8/15/2023 访问量:39

问:

这是在 Powershell 7.x 中,但我相信这是一个一般的正则表达式问题。

我将电子邮件中的标题放在一个长字符串中,并希望使用正则表达式使用 Powershell 拆分函数捕获它们以获取我需要的内容。

看起来像这样:

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+.*)*))'
正则表达式 PowerShell 多行

评论

0赞 Wiktor Stribiżew 8/14/2023
该模式应如下所示(?m)^\w.*(?:\n[\s-[\n]].*)*
0赞 94jeepyj 8/15/2023
我的错,忘了说我想捕获整个匹配的字符串,无论是否多行。所以我最终得到了 (?m)(^\w.*(?:\n[\s-[\n]].*)*) 谢谢 Wiktor。
0赞 mklement0 8/15/2023
很高兴听到您找到了解决方案。为了让其他人也能从中受益,请考虑将其作为答案发布,最好附上解释。

答:

0赞 Wiktor Stribiżew 8/15/2023 #1

你可以使用

(?m)^(\w.*(?:\n[\s-[\n]].*)*)

细节

  • (?m)- 多行修饰符
  • ^- 任何线路的起点
  • (\w.*(?:\n[\s-[\n]].*)*)- 捕获组 #1:
    • \w.*- 一个单词 char,然后是除换行符 char 之外的任何零个或多个字符
    • (?:\n[\s-[\n]].*)*- 换行符字符的重复次数为零次或多次,然后是换行符以外的任何空格,然后是换行符字符以外的任何零个或多个字符。

请参阅正则表达式演示