'What is the proper regex for capturing everything after "String" and between two delimeters ('=' and and non alphanumeric))

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}]
}

I want to capture exactly arn:aws:ec2:us-east-1:123:security-group/sg-123abc in this example. Generically, I want to capture the value of Id regardless of placement. My current solution is /Details={.*Id=(.*\w)/, but this only works if it's the last object in the data. How can I take into account the following potential scenario:

Id=arn:aws:ec2:us-east-1:123:security-group/sg-123abc, Thing=123abc}]



Solution 1:[1]

You can use look-behind to check that there is the Id= prefix, and then match anything that is not a space, comma or closing brace:

(?<=\bId=)[^,}\s]*

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 trincot