Details={
AwsEc2SecurityGroup={GroupName=m.com-rds, OwnerId=123, VpcId=vpc-123,
IpPermissions=[{FromPort=3306, ToPort=3306, IpProtocol=tcp, IpRanges=[{CidrIp=1.1.1.1/32}, {CidrIp=2.2.2.2/32}, {CidrIp=0.0.0.0/0}, {CidrIp=3.3.3.3/32}],
UserIdGroupPairs=[{UserId=123, GroupId=sg-123abc}]}], IpPermissionsEgress=[{IpProtocol=-1, IpRanges=[{CidrIp=0.0.0.0/0}]}], GroupId=sg-123abc}},
Region=us-east-1, Id=arn:aws:ec2:us-east-1:123:security-group/sg-123abc}]
}
我想在这个例子中准确地捕捉arn:aws:ec2:us-east-1:123:security-group/sg-123abc
。一般来说,我想捕获Id
的值,而不考虑位置。我目前的解决方案是/Details={.*Id=(.*w)/
,但只有当它是数据中的最后一个对象时,它才有效。我如何考虑以下潜在情况:
Id=arn:aws:ec2:us-east-1:123:security-group/sg-123abc, Thing=123abc}]
您有一个2倍.*
的模式,它将首先匹配到行/字符串的末尾(取决于点是否与换行符匹配(,并且它将回溯到模式Id=(.*w)
的这一部分可以匹配的最后一次出现。
如果你想使用一个捕获组,你可以让格式和允许的字符更具体一点:
bId=(w+(?:[:/-]w+)+)
零件中的图案
b
防止部分单词匹配的单词边界Id=
按字面匹配(
捕获组1w+
匹配1+个单词字符(?:[:/-]w+)+
重复1次以上:
/
-
和1个以上字字符
)
关闭组1
Regex演示
或者如果你知道它是从Id=arn:
开始的
bId=(arn:[w:/-]+)
Regex演示
请注意,只有当正则表达式的分隔符是正斜杠时,您才不必转义/
,但没有标记语言。
您可以使用look-behind检查是否有Id=
前缀,然后匹配任何不是空格、逗号或大括号的内容:
(?<=bId=)[^,}s]*