捕获"String"之后和两个分米("="和非字母数字)之间的所有内容的正确正则表达式是什么?


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=按字面匹配
  • (捕获组1
    • w+匹配1+个单词字符
    • (?:[:/-]w+)+重复1次以上:/-和1个以上字字符
  • )关闭组1

Regex演示

或者如果你知道它是从Id=arn:开始的

bId=(arn:[w:/-]+)

Regex演示

请注意,只有当正则表达式的分隔符是正斜杠时,您才不必转义/,但没有标记语言。

您可以使用look-behind检查是否有Id=前缀,然后匹配任何不是空格、逗号或大括号的内容:

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

最新更新