提问人:94jeepyj 提问时间:8/14/2023 最后编辑:94jeepyj 更新时间:8/15/2023 访问量:39
来自单个长字符串的多行正则表达式
Multiline regex from single long string
问:
这是在 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+.*)*))'
答:
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]].*)*
- 换行符字符的重复次数为零次或多次,然后是换行符以外的任何空格,然后是换行符字符以外的任何零个或多个字符。
请参阅正则表达式演示。
评论
(?m)^\w.*(?:\n[\s-[\n]].*)*