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