我想提取一个字符串,直到找到一个字符。例如:
message := "Rob: Hello everyone!"
user := strings.Trim(message,
我希望能够存储"Rob"
(找到':'
之后)。
答案 0 :(得分:6)
您可以使用strings.IndexByte()
或strings.IndexRune()
获取冒号':'
的位置(字节索引),然后只需slice string
值:
message := "Rob: Hello everyone!"
user := message[:strings.IndexByte(message, ':')]
fmt.Println(user)
输出(在Go Playground上尝试):
Rob
如果您不确定冒号是否在string
中,则必须先检查索引,然后再切片string
,否则会出现运行时混乱。这就是你如何做到的:
message := "Rob: Hello everyone!"
if idx := strings.IndexByte(message, ':'); idx >= 0 {
user := message[:idx]
fmt.Println(user)
} else {
fmt.Println("Invalid string")
}
输出相同。
将邮件更改为无效:
message := "Rob Hello everyone!"
此次输出是(在Go Playground上尝试):
Invalid string
另一个方便的解决方案是使用strings.Split()
:
message := "Rob: Hello everyone!"
parts := strings.Split(message, ":")
fmt.Printf("%q\n", parts)
if len(parts) > 1 {
fmt.Println("User:", parts[0])
}
输出(在Go Playground上尝试):
["Rob" " Hello everyone!"]
User: Rob
如果输入string
中没有冒号,strings.Split()
会返回一个包含单个string
值作为输入的字符串片段(上面的代码在这种情况下不会打印任何内容)长度为1
)。
答案 1 :(得分:1)
strings.Index或strings.IndexRune,取决于您是否要使用unicode作为分隔符,将为您提供所搜索字符的索引。
或者,您可以使用strings.Split并只获取返回的第一个字符串。
示例:user := strings.Split(message, ":")[0]
https://play.golang.org/p/I1P1Liz1F6
值得注意的是,如果分隔符不在原始字符串中,则不会出现混乱,但user
变量将设置为整个原始字符串。