英文:
How to improve a split logic in golang
问题
将以下示例作为索引的可能值:
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)
}
}
}
英文:
Having the following examples as possibles values from an index:
values := [5]string{"32.5ms", "32.5 ms", "32.5%", "32.5 %", "none"}
note that the original values could be with spaces, or without spaces from the measure unit (32.5%,32.5 %, 32.5 %,etc)
I need to split the float value and the unit of measure (%, ms, etc) from the original value, the bellow code, do the result I want, but I wanna know if there is some way more clean to do this same logic, maybe without regex.
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)
}
}
}
答案1
得分: 1
正则表达式似乎是适合这里的工具。个人而言,我会使用子组来实现,就像这样(我还清理了你的正则表达式,其中有一些不必要的语法和看起来像是 [\d{2}]*
的拼写错误):
regexFloatNumbers := regexp.MustCompile(`(-?\d[\d,]*\.?\d*) *(.*)`)
// ...
floatValue := regexFloatNumbers.FindStringSubmatch(value)
fmt.Printf("原始值: %q\n", value)
fmt.Printf("单位: %q\n", floatValue[1])
fmt.Printf("浮点数值: %v\n\n", floatValue[2])
https://go.dev/play/p/S6Jig4V4OVs
英文:
Regular expressions seem like the right fit here. Personally I'd use subgroups for this, like so (I also cleaned up your regex a little which had some unnecessary syntax and what looks like a typo with [\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])
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论