【问题标题】:Go: Retrieve a string from between two characters or other stringsGo:从两个字符或其他字符串之间检索字符串
【发布时间】:2015-01-11 01:47:43
【问题描述】:

例如,假设我有一个字符串,如下所示:

<h1>Hello World!</h1>

什么 Go 代码能够从该字符串中提取 Hello World!?我对 Go 还是比较陌生。非常感谢任何帮助!

【问题讨论】:

  • 您是否要解析特定的模式或格式?例如,文本是否总是被

    标记、一般的 HTML 或完全其他的东西包围?没有足够的信息来回答这个问题,所以我投反对票。

  • 只是匹配字符串。如果我点击一个匹配的字符串然后另一个,然后把中间的东西给我。
  • 要操作 HTML,请查看 GoQuerygolang.org/x/net/html (formerly go.net/html)
  • 这个问题的好答案是stackoverflow.com/a/62555190/3415984

标签: string go substring


【解决方案1】:

阅读字符串包。看看SplitAfter 函数,它可以做这样的事情:

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

这应该会产生一个类似于:"[", "this][", "is my][", "string]" 的切片。使用进一步的修剪功能,您应该得到您的解决方案。祝你好运。

【讨论】:

    【解决方案2】:

    在所有编程语言中都有很多分割字符串的方法。

    由于我不知道您特别要求什么,我提供了一个示例方法来获取输出 你想要的样本。

    package main
    
    import "strings"
    import "fmt"
    
    func main() {
        initial := "<h1>Hello World!</h1>"
    
        out := strings.TrimLeft(strings.TrimRight(initial,"</h1>"),"<h1>")
        fmt.Println(out)
    }
    

    在上面的代码中,您从字符串左侧修剪&lt;h1&gt;,从右侧修剪&lt;/h1&gt;

    正如我所说,拆分特定字符串的方法有数百种,这只是帮助您入门的示例。

    希望对您有所帮助,祝 Golang 好运 :)

    数据库

    【讨论】:

    • 这是错误的,因为 trim 参数是字符列表而不是字符串。如果initial := "&lt;h1&gt;hhhhhello&lt;/h1&gt;" 那么结果将是ello play.golang.org/p/HkopYJEDg9F
    • 忽略这个答案。它适用于@T145s 的具体情况,但一般不适用。下面的答案完美无缺。
    【解决方案3】:

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

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

    play!

    【讨论】:

    • 这如何回答 OP 关于在标签之间查找字符串的问题?它只显示如何删除标签。
    • 我的回答完全符合 OP 所要求的“什么 Go 代码能够从该字符串中提取 Hello World!?”
    【解决方案4】:

    如果字符串看起来像whatever;START;extract;END;whatever you can use this which will get the string in between:

    // 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[s:], end)
        if e == -1 {
            return
        }
        e += s + e - 1
        return str[s:e]
    }
    

    这里发生的是它将找到 START 的第一个索引,添加 START 字符串的长度并返回从那里存在的所有内容,直到 END 的第一个索引。

    【讨论】:

    • 这是最好的答案,但如果没有找到 END 或者在 START 之前也找到了 END,它会恐慌,请参阅此播放链接:play.golang.org/p/C2sZRYC15XN。该播放链接还包括修复此问题的修订。我将此修订提交给正在接受同行评审的 SO。
    • @schollz 是正确的,并提供了更正确的答案。复制和粘贴此答案很危险,因为它会引起恐慌。不过,感谢 Jan 的原创作品。
    【解决方案5】:
    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
    }
    

    【讨论】:

      【解决方案6】:
      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】:

        我改进了Jan Kardaš`s 的答案。 现在您可以在开头和结尾找到超过 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
        }
        

        【讨论】:

          【解决方案8】:

          这是我使用正则表达式的答案。不知道为什么没有人建议这种最安全的方法

          package main
          
          import (
              "fmt"
                  "regexp"
          )
          
          func main() {
              content := "<h1>Hello World!</h1>"
              re := regexp.MustCompile(`<h1>(.*)</h1>`)
              match := re.FindStringSubmatch(content)
              if len(match) > 1 {
                  fmt.Println("match found -", match[1])
              } else {
                  fmt.Println("match not found")
              }
              
          }
          

          游乐场 - https://play.golang.org/p/Yc61x1cbZOJ

          【讨论】:

            猜你喜欢
            • 2013-01-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-11
            • 1970-01-01
            相关资源
            最近更新 更多