Go 字符串-获取数字前的字符

Go 字符串-获取数字前的字符,go,Go,我有一些字符串,比如e29nz,N29DZ,EW29DZ。我需要提取第一个数字之前的字符,给出上面的示例:E,N,EW。 我应该用正则表达式吗?这个包看起来非常好,但似乎无法处理这种情况(在特定类型之前提取所有内容) 编辑: 为了澄清这个“问题”,我想知道哪种方法更惯用,并且可能提供更好的性能。下面的代码将继续抓取字符,直到它达到一个数字 int i = 0; String string2test = "EW29DZ"; String stringOutput = ""; while (!Ch

我有一些字符串,比如
e29nz
N29DZ
EW29DZ
。我需要提取第一个数字之前的字符,给出上面的示例:
E
N
EW
。 我应该用正则表达式吗?这个包看起来非常好,但似乎无法处理这种情况(在特定类型之前提取所有内容)

编辑:


为了澄清这个“问题”,我想知道哪种方法更惯用,并且可能提供更好的性能。

下面的代码将继续抓取字符,直到它达到一个数字

int i = 0;
String string2test = "EW29DZ";
String stringOutput = "";

while (!Character.isDigit(string2test.charAt(i))) 
   {
   stringOutput = stringOutput + string2test.charAt(i);
   i++;
   }

我们不需要正则表达式来解决这个问题。您可以轻松地浏览一段符文,并使用unicode.IsDigit()检查当前字符(如果是数字):return。如果不是:继续循环。如果没有数字:返回参数

代码
不知道为什么几乎每个人都提供了答案,除了围棋。以下是基于正则表达式的Go版本:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    pattern, err := regexp.Compile("^[^\\d]*")
    if err != nil {
        panic(err)
    }

    part := pattern.Find([]byte("EW29DZ"))
    if part != nil {
        fmt.Printf("Found: %s\n", string(part))
    } else {
        fmt.Println("Not found")
    }
}
运行:

%go运行main.go
发现:EW

我认为最好的选择是使用从
字符串返回的索引。IndexAny
将返回字符串中任何字符的第一个索引

func BeforeNumbers(str string) string { 
    value := strings.IndexAny(str,"0123456789")
    if value >= 0 && value <= len(str) {
        return str[:value]
    }

    return str
}
这或多或少相当于循环版本,并且消除了对长字符串的搜索,以检查我以前答案中的每个字符是否匹配。但我认为它看起来比循环版本更干净,这显然是一种口味。

例如

package main

import (
    "fmt"
    "unicode"
)

func DigitPrefix(s string) string {
    for i, r := range s {
        if unicode.IsDigit(r) {
            return s[:i]
        }
    }
    return s
}

func main() {
    fmt.Println(DigitPrefix("E2 9NZ"))
    fmt.Println(DigitPrefix("N29DZ"))
    fmt.Println(DigitPrefix("EW29DZ"))
    fmt.Println(DigitPrefix("WXYZ"))
}
输出:

E
N
EW
WXYZ

如果没有数字,例如
“WXYZ”
,并且您不希望返回任何内容,请将
return s
更改为
return”“

我认为它实际上没有运行。类型应该在之后声明,不是吗?它不是Go代码。一开始他没有这么说,而我错过了标签。@codemonkey那不是真的!最初指定了“Go”,只是没有href。此外,“go”是唯一分配给问题的标签。我说我错过了标签。这是我的错。
package main

import (
    "fmt"
    "unicode"
)

func DigitPrefix(s string) string {
    for i, r := range s {
        if unicode.IsDigit(r) {
            return s[:i]
        }
    }
    return s
}

func main() {
    fmt.Println(DigitPrefix("E2 9NZ"))
    fmt.Println(DigitPrefix("N29DZ"))
    fmt.Println(DigitPrefix("EW29DZ"))
    fmt.Println(DigitPrefix("WXYZ"))
}
E
N
EW
WXYZ