让我们举例说我有一个字符串,如下所示:
<h1>Hello World!</h1>
Go代码能够从该字符串中提取Hello World!
吗?我还是比较新的Go。非常感谢任何帮助!
答案 0 :(得分:9)
有很多方法可以在所有编程语言中拆分字符串。
因为我不知道你特别要求我提供一个获取输出的示例方法 你想要的样品。
package main
import "strings"
import "fmt"
func main() {
initial := "<h1>Hello World!</h1>"
out := strings.TrimLeft(strings.TrimRight(initial,"</h1>"),"<h1>")
fmt.Println(out)
}
在上面的代码中,您可以从字符串的左侧剪裁<h1>
,从右侧剪裁</h1>
。
正如我所说,有数百种方法可以分割特定的字符串,这只是一个让你入门的例子。
希望它有所帮助,祝你好运Golang:)
DB
答案 1 :(得分:8)
如果字符串看起来像什么; START; extract; END;无论你使用什么:
// GetStringInBetween Returns empty string if no start string found
func GetStringInBetween(str string, start string, end string) (result string) {
s := strings.Index(str, start)
if s == -1 {
return
}
s += len(start)
e := strings.Index(str, end)
return str[s:e]
}
这里发生的是它将找到START的第一个索引,添加START字符串的长度并返回从那里存在的所有内容,直到END的第一个索引。
答案 2 :(得分:2)
在strings pkg中,您可以使用Replacer产生重大影响。
r := strings.NewReplacer("<h1>", "", "</h1>", "")
fmt.Println(r.Replace("<h1>Hello World!</h1>"))
转到play!
答案 3 :(得分:2)
func findInString(str, start, end string) ([]byte, error) {
var match []byte
index := strings.Index(str, start)
if index == -1 {
return match, errors.New("Not found")
}
index += len(start)
for {
char := str[index]
if strings.HasPrefix(str[index:index+len(match)], end) {
break
}
match = append(match, char)
index++
}
return match, nil
}
答案 4 :(得分:2)
我改善了Jan Kardaš
的答案。
现在您可以在开头和结尾处找到超过1个字符的字符串。
func GetStringInBetweenTwoString(str string, startS string, endS string) (result string,found bool) {
s := strings.Index(str, startS)
if s == -1 {
return result,false
}
newS := str[s+len(startS):]
e := strings.Index(newS, endS)
if e == -1 {
return result,false
}
result = newS[:e]
return result,true
}
答案 5 :(得分:1)
阅读字符串包。查看SplitAfter函数,它可以执行以下操作:
var sample = "[this][is my][string]"
t := strings.SplitAfter(sample, "[")
这应该产生类似于:"[", "this][", "is my][", "string]"
的切片。使用其他功能进行修剪,您应该得到解决方案。祝你好运。
答案 6 :(得分:0)
func Split(str, before, after string) string {
a := strings.SplitAfterN(str, before, 2)
b := strings.SplitAfterN(a[len(a)-1], after, 2)
if 1 == len(b) {
return b[0]
}
return b[0][0:len(b[0])-len(after)]
}
第一次调用SplitAfterN
会将原始字符串分成2个部分的数组,再除以找到的第一个after
字符串,否则将生成包含等于原始字符串的1个部分的数组。
第二次调用SplitAfterN
使用a[len(a)-1]
作为输入,因为它是“数组a
的最后一项”。因此,要么是after
之后的字符串,要么是原始字符串str
。输入将被分为2部分的数组,再除以找到的第一个before
字符串,或者将产生包含等于输入部分的1的数组。
如果未找到after
,那么我们可以简单地返回b[0]
,因为它等于a[len(a)-1]
如果找到after
,它将包含在b[0]
字符串的末尾,因此您必须通过b[0][0:len(b[0])-len(after)]
修整它
所有字符串区分大小写
答案 7 :(得分:0)
只是有一个类似的问题,只是我不知道我的输入字符串是否包含任何或什至多对START或STOP字符!所以我的一般解决方案是:
s := "\x02this is a test\x03-\x02another test\x03"
start, end := "\x02", "\x03" // just replace these with whatever you like...
sSplits := strings.Split(s, start)
result := []string{}
if len(sSplits) > 1 { // n splits = 1 means start char not found!
for _, subStr := range sSplits { // check each substring for end
ixEnd := strings.Index(subStr, end)
if ixEnd != -1 {
result = append(result, subStr[:ixEnd])
}
}
}