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

问题描述 投票:0回答:6

比方说我有一个字符串,如下所示:

<h1>Hello World!</h1>

什么Go代码能够从该字符串中提取Hello World!?我还是比较新的Go。任何帮助是极大的赞赏!

string go substring
6个回答
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


9
投票

如果字符串看起来像什么; 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
投票

strings pkg中你可以使用Replacer来产生很大的影响。

r := strings.NewReplacer("<h1>", "", "</h1>", "")
fmt.Println(r.Replace("<h1>Hello World!</h1>"))

play!


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
}

1
投票

阅读弦乐包。看看SplitAfter函数,它可以做这样的事情:

var sample = "[this][is my][string]"
t := strings.SplitAfter(sample, "[")

这应该产生一个像:"[", "this][", "is my][", "string]"。使用其他功能进行修剪,您应该得到解决方案。祝你好运。


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的第一次调用会将原始字符串拆分为由第一个找到的after字符串划分的2个部分的数组,或者它将生成包含等于原始字符串的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)]修剪它

所有字符串都区分大小写


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])
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.