【问题标题】:Replace multiple month-strings to month-ints将多个月份字符串替换为月份整数
【发布时间】:2021-01-23 07:09:22
【问题描述】:

我正在使用如下字符串:

"JAN-5,Feb,6 dec=900"

我希望将 Month 字符串替换为它们各自的月份 int 值。所以上面就相当于:

"1-5,2,6 12=900"

我知道使用不区分大小写的正则表达式可能是可行的方法,但是我只看到了如何一次将其应用于一个月的示例,这似乎效率低下,例如:

re := regexp.MustCompile(`(?i)jan`)
fmt.Println(re.ReplaceAllString("JAN-5,Feb,6 dec=900", "1"))

有没有比对字符串应用 12 种不同的正则表达式测试更简单的方法?

【问题讨论】:

  • 您需要保留字符串“case-intact”的其余部分吗?如果字符串的其他部分变成小写,可以吗?
  • ` 似乎效率低下` 不要假设性能问题,测量它。对于非常高的性能,您可以编写自己的词法分析器/解析器,但这仅在您真正需要的时候。正则表达式会带来很多问题,例如 ReDos 攻击。带有规范化字符串的简单ReplaceAll 可以完成这项工作
  • @icza 大小写完整不应该是一个问题,因为唯一的字母字符将是月份字符串,因此最终替换为它们的 int 等价物。字符串中的任何其他字符都是特殊字符,例如“,=/”等
  • @Ôrel 可以使用一次ReplaceAll 吗?还是有 12 个 ReplaceAll 来解析每个可能的选项..?
  • 你也许可以使用; golang.org/pkg/strings/#NewReplacer

标签: string go replace


【解决方案1】:

使用strings.ToLower() 降低字符串,然后您可以使用单个strings.Replacer 12 个月,在一个“步骤”中完成所有可能的替换:

var r = strings.NewReplacer(
    "jan", "1",
    "feb", "2",
    "mar", "3",
    "apr", "4",
    "may", "5",
    "jun", "6",
    "jul", "7",
    "aug", "8",
    "sep", "9",
    "oct", "10",
    "nov", "11",
    "dec", "12",
)

func main() {
    s := "JAN-5,Feb,6 dec=900"

    s2 := r.Replace(strings.ToLower(s))

    fmt.Println(s2)
}

这将输出(在Go Playground 上尝试):

1-5,2,6 12=900

【讨论】:

  • 这太棒了。我从没听说过strings.NewReplacer,而且效果很好!
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2014-03-30
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多