【发布时间】:2021-07-30 11:02:15
【问题描述】:
我有一个表示计算机对象大小的结构。该结构的对象由用户输入的字符串值构成;例如"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 和 string 组件并返回一个指向结构的指针。
不过,为了完成这三件事,我必须编译 3 次正则表达式。 第一次检查输入字符串的格式
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 循环来解析输入字符串。
【问题讨论】:
-
使用捕获组,
^([0-9]+)([KMGT]?B)$。