在Go语言中通过删除子字符串将字符串分割为两部分

huangapple go评论91阅读模式
英文:

Splitting string in 2 parts by removing substring in golang

问题

我正在尝试解析类似于以下形式的字符串:

abc***********xyz

将其解析为一个切片(或两个变量)的"abc"和"xyz",并删除所有的星号。

星号的数量和两侧的字母都可以是可变的,所以长度不一定是固定的。我想知道Go语言是否有使用strings包来实现这个功能的好方法?

英文:

I'm trying to parse strings that look something like this:

abc***********xyz

into a slice (or 2 variables) of "abc" and "xyz", removing all the asterisks.

The number of * can be variable and so can the letters on each side, so it's not necessarily a fixed length. I'm wondering if go has a nice way of doing this with the strings package?

答案1

得分: 3

使用strings.FieldsFunc函数,其中*是字段分隔符。

s := "abc***********xyz"
z := strings.FieldsFunc(s, func(r rune) bool { return r == '*' })
fmt.Println(len(z), z)  // 输出 2 [abc xyz]

在线示例

英文:

Use strings.FieldsFunc where * is a field separator.

s := "abc***********xyz"
z := strings.FieldsFunc(s, func(r rune) bool { return r == '*' })
fmt.Println(len(z), z)  // prints 2 [abc xyz]

Live Example.

答案2

得分: 1

在任意数量的星号上进行分割:

words := regexp.MustCompile(`\*+`).Split(str, -1)

请参考实时演示

英文:

Split on any number of asterisks:

words := regexp.MustCompile(`\*+`).Split(str, -1)

See live demo.

答案3

得分: 0

如果性能是一个问题,你可以使用这个函数:

func SplitAsteriks(s string) (result []string) {
	if len(s) == 0 {
		return
	}

	i1, i2 := 0, 0

	for i := 0; i < len(s); i++ {
		if s[i] == '*' && i1 == 0 {
			i1 = i
		}
		if s[len(s)-i-1] == '*' && i2 == 0 {
			i2 = len(s) - i
		}
		if i1 > 0 && i2 > 0 {
			result = append(result, s[:i1], s[i2:])
			return
		}
	}

	result = append(result, s)
	return
}

playground

英文:

if performance is an issue, you can use this func:

func SplitAsteriks(s string) (result []string) {
	if len(s) == 0 {
		return
	}

	i1, i2 := 0, 0

	for i := 0; i &lt; len(s); i++ {
		if s[i] == &#39;*&#39; &amp;&amp; i1 == 0 {
			i1 = i
		}
		if s[len(s)-i-1] == &#39;*&#39; &amp;&amp; i2 == 0 {
			i2 = len(s) - i
		}
		if i1 &gt; 0 &amp;&amp; i2 &gt; 0 {
			result = append(result, s[:i1], s[i2:])
			return
		}
	}

	result = append(result, s)
	return
}

playground

答案4

得分: 0

为了获得最佳性能,请编写一个for循环:

func SplitAsteriks(s string) []string {
    var (
        in     bool     // true表示在一个标记内部
        tokens []string // 在这里收集函数的结果
        i      int
    )
    for j, r := range s {
        if r == '*' {
            if in {
                // 从标记到分隔符的转换
                tokens = append(tokens, s[i:j])
                in = false
            }
        } else {
            if !in {
                // 从一个或多个分隔符到标记的转换
                i = j
                in = true
            }
        }
    }
    if in {
        tokens = append(tokens, s[i:])
    }
    return tokens
}

Playground

英文:

For best performance, write a for loop:

func SplitAsteriks(s string) []string {
	var (
		in     bool     // true if inside a token
		tokens []string // collect function result here
		i      int
	)
	for j, r := range s {
		if r == &#39;*&#39; {
			if in {
                // transition from token to separator
				tokens = append(tokens, s[i:j])
				in = false
			}
		} else {
			if !in {
                // transition from one or more separators to token
				i = j
				in = true
			}
		}
	}
	if in {
		tokens = append(tokens, s[i:])
	}
	return tokens
}

Playground.

答案5

得分: 0

使用以下代码,假设字符串被指定为两部分:

s := "abc***********xyz"
p := s[:strings.IndexByte(s, '*')]
q := s[strings.LastIndexByte(s, '*')+1:]
fmt.Println(p, q) // 输出 abc xyz

这段代码的作用是将字符串 s 按照 * 分割成两部分,并打印出分割后的结果。其中 p 表示 * 前面的部分,q 表示 * 后面的部分。

英文:

Use this code given that the string is specified to have two parts:

s := &quot;abc***********xyz&quot;
p := s[:strings.IndexByte(s, &#39;*&#39;)]
q := s[strings.LastIndexByte(s, &#39;*&#39;)+1:]
fmt.Println(p, q) // prints abc xyz

huangapple
  • 本文由 发表于 2022年8月23日 04:29:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/73450688.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定