如何编写单个正则表达式提取文本中的多个指定目标内容?
正则表达式一次性提取多个目标内容
需求场景
给定文本:
CpuUtilization[GqIF:CA-TORONTO-1-AD-1 | FAULT-DOMAIN-1 | ocid1.image.oc1.ca-toronto-1.aaaaaaaanzxg2lycvtpzgobswpp3kht3byzc4kduvbuzks7u65r5zlyrzdaq | Default | ca-toronto-1 | Bastion | ocid1.instance.oc1.ca-toronto-1.an2g6ljrwe6j4fqcnimiwc5wkneq7x6zcd4m23emiv7scbx47za7bpht54la | VM.Standard.E3.Flex]
需要一次性提取三个目标值:CA-TORONTO-1-AD-1、Bastion、VM.Standard.E3.Flex。
解决方案
可以通过包含三个捕获组的单个正则表达式实现,以下两种写法都可行:
写法1(直观匹配)
^CpuUtilization\[GqIF:([^|]+) \| .*? \| .*? \| .*? \| .*? \| ([^|]+) \| .*? \| ([^\]]+)\]$
- 捕获组1:匹配
GqIF:后到第一个|前的内容,对应CA-TORONTO-1-AD-1 - 捕获组2:匹配第6个
|分隔的字段,对应Bastion - 捕获组3:匹配最后一个
|后到]前的内容,对应VM.Standard.E3.Flex
写法2(高效精准,按字段位置跳过)
^CpuUtilization\[GqIF:([^|]+)(?: \| [^|]+){4} \| ([^|]+)(?: \| [^|]+) \| ([^\]]+)\]$
(?: \| [^|]+){4}:用非捕获组跳过前4个不需要的字段(FAULT-DOMAIN-1 到 ca-toronto-1)- 捕获组2直接定位到第6个字段的
Bastion (?: \| [^|]+):跳过中间的实例ID字段- 捕获组3匹配最后一个目标值
VM.Standard.E3.Flex
使用说明
在支持多捕获组的工具(如Python的re模块、grep -P、各类正则测试工具)中,提取捕获组1、2、3的结果,就能得到三个目标内容。
内容的提问来源于stack exchange,提问作者MikeKim
相关产品推荐
相关产品推荐

