猿问

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

我有一个表示计算机对象大小的结构。此结构的对象是根据用户输入的字符串值构造的;例如,“50KB”将被标记化为int值“50”和字符串值“KB”。


type SizeUnit string


const (

    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循环来解析输入字符串。


开心每一天1111
浏览 124回答 1
1回答

慕姐4208626

您可以使用正则表达式使用单个表达式捕获这两个值。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]
随时随地看视频慕课网APP

相关分类

Go
我要回答