You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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-20
  • 1;3;5-10;15-20
  • 1 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:15:11