如何改进golang中的分裂逻辑

gmxoilav  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(96)

下面的例子是指数中可能的值:

values := [5]string{"32.5ms", "32.5 ms", "32.5%", "32.5 %", "none"}

请注意,原始值可以带有空格,也可以不带有空格(32.5%、32.5%、32.5%等)
我需要从原始值中分离浮点值度量单位(%,ms等),下面的代码,做我想要的结果,但我想知道是否有一些更干净的方法来做同样的逻辑,也许没有正则表达式。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {

    regexFloatNumbers := regexp.MustCompile(`[-]?\d[\d,]*[\.]?[\d{2}]*`)

    values := [5]string{"32.5ms", "32.5 ms", "32.5%", "32.5 %", "none"}

    for _, value := range values {

        if regexFloatNumbers.MatchString(value) {
            floatValue := regexFloatNumbers.FindString(value)
            fmt.Printf("ORIGINAL VALUE: %q\n", value)
            fmt.Printf("UNIT: %q\n", strings.TrimSpace(regexFloatNumbers.Split(value, -1)[1]))
            fmt.Printf("FLOAT VALUE: %v\n\n", floatValue)
        } else {
            fmt.Printf("float value for %v has not being found!", value)
        }

    }

}
yv5phkfx

yv5phkfx1#

正则表达式看起来很适合这里,我个人会使用子群,比如(我还清理了你的正则表达式,它有一些不必要的语法,看起来像是[\d{2}]*的拼写错误):

regexFloatNumbers := regexp.MustCompile(`(-?\d[\d,]*\.?\d*) *(.*)`)

// ...

floatValue := regexFloatNumbers.FindStringSubmatch(value)
fmt.Printf("ORIGINAL VALUE: %q\n", value)
fmt.Printf("UNIT: %q\n", floatValue[1])
fmt.Printf("FLOAT VALUE: %v\n\n", floatValue[2])

https://go.dev/play/p/S6Jig4V4OVs

相关问题