Go语言中如何用正则分割不含指定词汇的字符串?列表解析优化方案
数字列表解析函数的实现与优化
初始实现
我编写了ParseList函数,用于解析数字列表字符串,接收三个参数:数字列表字符串、列表项分隔正则(ls)和范围分隔正则(rs),代码如下:
func ParseList(list string, ls, rs *regexp.Regexp) (...) { ... for _, item := range ls.Split(list, -1) { for _, rng := range rs.Split(item, -1) { range_start, _ := strconv.ParseInt(rng[0]) range_end := range_start if len(rng) > 1 { range_end, _ = strconv.ParseInt(rng[1]) } ... save or analyse range } } ... }
支持的输入字符串示例包括:
1,3,5-10,15-201;3;5-10;15-201 3 5 to 10 15 to 20
前两个示例的正则匹配容易实现,但第三个示例存在逻辑冲突:列表分隔符为空格,而范围分隔符(to)也包含空格,导致分割逻辑混乱。
优化后的实现
采纳Trung Duong的建议,将“分割式正则”改为“提取式正则”,修改后的函数代码如下:
func ParseList(list string, ex, rs *regexp.Regexp) (...) { ... for _, item := range ex.FindAllString(list, -1) { for _, rng := range rs.Split(item, -1) { range_start, _ := strconv.ParseInt(rng[0]) range_end := range_start if len(rng) > 1 { range_end, _ = strconv.ParseInt(rng[1]) } ... save or analyse range } } ... }
现在可以使用提取式正则先把单个数字或数字范围提取出来,再进行分割处理,比如:
- 针对
-分隔的范围:(\d+-\d+)|(\d+) - 针对
to分隔的范围:(\d+ to \d+)|(\d+)
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

