代码之家  ›  专栏  ›  技术社区  ›  user1028741

Go(字符串)-修剪重复的前缀/后缀子字符串

  •  1
  • user1028741  · 技术社区  · 4 年前

    我需要修剪重复的前缀和后缀子字符串( "%20" )字符串的。
    示例: %20%20Hello%20World%20%20 --> Hello%20World

    我能带来的最好的东西是:

    func trimPrefix(s string, prefix string) string {
        for ; strings.HasPrefix(s, prefix); {
            s = s[len(prefix):]
        }
        return s
    }
    
    func trimSuffix(s string, suffix string) string {
        for ; strings.HasSuffix(s, suffix); {
            s = s[:len(s)-len(suffix)]
        }
        return s
    }
    
    func trim(s, ss string) string {
        return trimPrefix(trimSuffix(s, ss), ss)
    }
    

    在Go中有更优雅的方法吗?

    1 回复  |  直到 4 年前
        1
  •  3
  •   mkopriva    4 年前

    您可以执行以下操作:

    func trimSubstr(s string, substr string) (t string) {
        for {
            t = strings.TrimPrefix(s, substr)
            t = strings.TrimSuffix(t, substr)
            if t == s { // exit if nothing was trimmed from s
                break
            }
            s = t // update to last result
        }
        return t
    }
    

    https://go.dev/play/p/eIk6A8K3Q_1

        2
  •  2
  •   blackgreen VonC    4 年前

    strings.Trim 是这样吗

    Trim返回字符串s的一个片段 所有前导和尾随 剪切集中包含的Unicode代码点已删除。

    package main
    
    import (
        "fmt"
        "strings"
    )
    
    func main() {
        s := "%20%20Hello%20World%20%20"
        t := strings.Trim(s, "%20")
    
        fmt.Println(t) // prints Hello%20World
    }
    

    如果前缀和后缀符文总是以中给定的相同顺序出现,则此操作非常有效 cutset 参数。

    如果您的输入字符串可能以不同的顺序显示这些字符(有关详细信息,请参阅此答案的注释),那么您的解决方案是好的。您可以使用 strings.TrimPrefix strings.TrimSuffix 从标准lib,而不是滚动自己的,并将其组合在一个函数中:

    func trim(s, sub string) string {
        for strings.HasPrefix(s, sub) {
            s = strings.TrimPrefix(s, sub)
        }
        for strings.HasSuffix(s, sub) {
            s = strings.TrimSuffix(s, sub)
        }
        return s
    }