为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不编译每个表达式的情况下从正则表达式中提取不同的变量

如何在不编译每个表达式的情况下从正则表达式中提取不同的变量

Go
开心每一天1111 2022-08-30 14:40:29
我有一个表示计算机对象大小的结构。此结构的对象是根据用户输入的字符串值构造的;例如,“50KB”将被标记化为int值“50”和字符串值“KB”。type SizeUnit stringconst (    B  = "B"    KB = "KB"    MB = "MB"    GB = "GB"    TB = "TB")type ObjectSize struct {    NumberOfUnits int    Unit          SizeUnit}func NewObjectSizeFromString(input_str string) (*ObjectSize, error)在这个函数的主体中,我首先检查输入值是否为有效格式;即任意位数,后跟“B”、“KB”、“MB”、“GB”或“TB”中的任何一位。然后,我分别提取 int 和字符串组件,并返回指向结构的指针。为了做这三件事,我不得不编译正则表达式三次。第一次检查输入字符串的格式rg, err := regexp.Compile(`^[0-9]+B$|KB$|MB$|GB$|TB$`)然后再次编译以获取int组件:rg, err := regexp.Compile(`^[0-9]+`)rg.FindString(input_str)然后再次编译以获取字符串/单位组件:rg, err := regexp.Compile(`B$|KB$|MB$|GB$|TB$`)rg.FindString(input_str)有没有办法通过单个正则表达式编译从输入字符串中获取两个组件?完整的代码可以在Go Playground上找到。我应该指出,这是一个学术问题,因为我正在试验Go的正则表达式库。对于这种类型的简单用例,我可能会使用一个简单的for循环来解析输入字符串。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您可以使用正则表达式使用单个表达式捕获这两个值。FindStringSubmatch:


func NewObjectSizeFromString(input_str string) (*ObjectSize, error) {

    var defaultReturn *ObjectSize = nil

    full_search_pattern := `^([0-9]+)([KMGT]?B)$`


    rg, err := regexp.Compile(full_search_pattern)

    if err != nil {

        return defaultReturn, errors.New("Could not compile search expression")

    }

    matched := rg.FindStringSubmatch(input_str)

    if matched ==  nil {

        return defaultReturn, errors.New("Not in valid format")

    }

    i, err := strconv.ParseInt(matched[1], 10, 32)

    return &ObjectSize{int(i), SizeUnit(matched[2])}, nil

}

可以看到游乐场

正则表达式匹配^([0-9]+)([KMGT]?B)$

  • ^- 字符串的开头

  • ([0-9]+)- 组 1(此值将保存在):一个或多个数字matched[1]

  • ([KMGT]?B)- 组 2 (它将在): 一个可选的 , , , 字母, 然后是一个字母matched[2]KMGTB

  • $- 字符串末尾。

请注意,这将保持整个比赛。matched[0]


查看完整回答
反对 回复 2022-08-30
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号