分割一串带有一个副字母,一个副数字的字符串

时间:2018-07-10 23:02:11

标签: go

我对此有空白。我正在接收格式的字符串。 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/

3 个答案:

答案 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:]
}