Go:从两个字符或其他字符串之间检索字符串

时间:2014-11-13 19:35:46

标签: string go substring

让我们举例说我有一个字符串,如下所示:

<h1>Hello World!</h1>

Go代码能够从该字符串中提取Hello World!吗?我还是比较新的Go。非常感谢任何帮助!

8 个答案:

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