我对此有空白。我正在接收格式的字符串。 AB1234 ABC1234 ABC123 AB12 等等等等。基本上是航班号
他们可以有一个或两个字母以及1到5个数字。我想分割字符串,以便最终得到两个字符串,一个带有数字,另一个带有字母。
有什么想法吗?我看过这些,但看不到能胜任的工作 https://www.dotnetperls.com/split-go
更新:
除非有更好的选择,否则请找到并使用它。删除所有字母/数字以创建所需的字符串https://golangcode.com/how-to-remove-all-non-alphanumerical-characters-from-a-string/
答案 0 :(得分:5)
您可以利用Go是一种编程语言这一事实,并编写一个简单的Go函数。例如,
package main
import (
"fmt"
)
func parseFlight(s string) (letters, numbers string) {
var l, n []rune
for _, r := range s {
switch {
case r >= 'A' && r <= 'Z':
l = append(l, r)
case r >= 'a' && r <= 'z':
l = append(l, r)
case r >= '0' && r <= '9':
n = append(n, r)
}
}
return string(l), string(n)
}
func main() {
flights := []string{"AB1234", "ABC1234", "ABC123", "AB12"}
for _, flight := range flights {
letters, numbers := parseFlight(flight)
fmt.Printf("%q: %q %q\n", flight, letters, numbers)
}
}
游乐场:https://play.golang.org/p/pDrsqntAP6E
输出:
"AB1234": "AB" "1234"
"ABC1234": "ABC" "1234"
"ABC123": "ABC" "123"
"AB12": "AB" "12"
答案 1 :(得分:1)
Go的regex语法似乎不支持先行,因此您必须匹配两个部分并手动提取它们,而不是使用split方法。
package main
import (
"regexp"
"fmt"
)
var reFlightNumbers = regexp.MustCompile("([A-Z]+)([0-9]+)")
func main() {
matches := reFlightNumbers.FindStringSubmatch("ABC123")
fmt.Println(matches[1])
fmt.Println(matches[2])
}
答案 2 :(得分:0)
您可以使用strings.IndexAny
:
package flight
import "strings"
func split(s string) (string, string) {
n := strings.IndexAny(s, "0123456789")
return s[:n], s[n:]
}
或strings.IndexFunc
:
package flight
import (
"strings"
"unicode"
)
func split(s string) (string, string) {
n := strings.IndexFunc(s, unicode.IsDigit)
return s[:n], s[n:]
}