登录
首页 >  Golang >  Go问答

匹配多种格式的正则表达式来提取aws accountid

来源:stackoverflow

时间:2024-04-15 15:48:35 320浏览 收藏

来到golang学习网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《匹配多种格式的正则表达式来提取aws accountid》,介绍一下,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我想使用一个正则表达式来提取两种格式的 aws 账户 id

arn:aws:ec2:us-west-2:1234567890:instance/i-0a89fdbedc3f1d76a
arn:aws:iam::1234567890:instance-profile/aws-elasticbeanstalk-ec2-role

即,正则表达式应该能够匹配两行中的 1234567890

我知道如何为每种格式创建正则表达式,但如果可能的话希望有一个正则表达式。


正确答案


我将使用以下正则表达式:arn:aws:(?:ec2|iam):[^:]*:([0-9]+): 前缀为 arn:aws:,后跟 ec2iam 以及一个可能为空的段。前缀后面必须有一组非空数字。它正是具有实例编号的组。

示例 https://go.dev/play/p/mP6VyIYa3v_N

package main

import (
    "fmt"
    "regexp"
)

const (
    s1 = "arn:aws:ec2:us-west-2:1234567890:instance/i-0a89fdbedc3f1d76a"
    s2 = "arn:aws:iam::1234567890:instance-profile/aws-elasticbeanstalk-ec2-role"
)

func main() {
    restr := `arn:aws:(?:ec2|iam):[^:]*:([0-9]+):`
    re, err := regexp.compile(restr)
    if err != nil {
        panic(err)
    }
    m1 := re.findstringsubmatch(s1)
    fmt.println("user id in ec2: ", m1[1])
    m2 := re.findstringsubmatch(s2)
    fmt.println("user id in iam: ", m2[1])
}

此正则表达式使用非捕获组 (?:ec2|iam)。与该组对应的子匹配不包含在 regexp.findstringsubmatch 返回的数组中。这样做只是为了方便:findstringsubmatch 返回的数组只有 2 个元素 - 完全匹配和组 ([0-9]+) 的匹配。

您可以使用完整组 (ec2|iam)。在这种情况下,用户 id 组将在 findstringsubmatch 返回的匹配数组中具有索引 2

不需要 regexp,只需选择第五列:

package aws

import (
   "strconv"
   "strings"
)

func extract(s string) (int, error) {
   split := strings.SplitN(s, ":", 6)
   return strconv.Atoi(split[4])
}

https://godocs.io/strings#SplitN

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《匹配多种格式的正则表达式来提取aws accountid》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>