如何在Golang的字符串中每X个字符插入一个字符?

时间:2015-11-10 15:09:58

标签: string go character

目标:在Golang的字符串中每x个字符插入一个字符

输入: helloworldhelloworldhelloworld

预期输出: hello-world-hello-world-hello-world

尝试

尝试一次

package main

import (
    "fmt"
    "strings"
)

func main() {
    s := "helloworldhelloworldhelloworld"

    s = strings.Replace(s, "world", ",", -1)
    fmt.Println(s)
}

结果为:hello,hello,hello,

尝试两个

  1. 计算字符数
  2. For loop
  3. 如果X = 5,则插入-
  4. 尝试三个

    1. 扫描结合加入
    2. 问题

      目前尝试二和三不包含代码片段的原因是我仍在考虑应该使用什么方法在Golang的字符串中每隔X个字符插入一个字符。

6 个答案:

答案 0 :(得分:5)

https://play.golang.org/p/HEGbe7radf

此函数只插入' - '每个第N个元素

func insertNth(s string,n int) string {
    var buffer bytes.Buffer
    var n_1 = n - 1
    var l_1 = len(s) - 1
    for i,rune := range s {
       buffer.WriteRune(rune)
       if i % n == n_1 && i != l_1  {
          buffer.WriteRune('-')
       }
    }
    return buffer.String()
}

答案 1 :(得分:1)

根据Go文档strings are a read only Slice of bytes.。考虑到这一点,出现了一个问题。你使用什么字符集?你可以看到一些事情变得奇怪的例子herehere

尽管复杂性仍有一个简单的答案

s = strings.Replace(s, "hello", "hello-", -1)
s = strings.Replace(s, "world", "world-", -1)

答案 2 :(得分:1)

我的看法:

$('.adv-grid-cell.field1').filter(function() {
    return $(this).text().trim() == '421';
}).siblings(".adv-grid-cell.description").text('Samantha');

Playground link

我应该补充说,虽然可以实施 "接近3" - 那个"将源字符串拆分成块 五个字符然后使用' - '加入块。字符"一, - 它仍然需要像 import ( "fmt" "regexp" ) const s = "helloworldhelloworldhelloworld" func Attempt1(s string) string { var re = regexp.MustCompile(`(\Bhello|\Bworld)`) return re.ReplaceAllString(s, "-$1") } func Attempt2(s string) string { const chunkLen = len("hello") out := make([]rune, len(s)+len(s)/chunkLen) i, j := 1, 0 for _, c := range s { out[j] = c if i == len(s) { break } j++ if i%chunkLen == 0 { out[j] = '-' j++ } i++ } return string(out) } func main() { fmt.Println(Attempt1(s)) fmt.Println(Attempt2(s)) } 那样扫描源符号符文符文符。所以,如果你眯着眼睛,你会看到存储 一个块列表然后加入它们正在做更多的操作 没有真正的收获(以及更大的内存占用等)。

答案 3 :(得分:0)

我觉得以下解决方案值得一提:

package main

import "fmt"

var s = "helloworldhelloworldhelloworld"

func main() {
    for i := 5; i < len(s); i += 6 {
        s = s[:i] + "-" + s[i:]
    }
    fmt.Println(s)
}

https://play.golang.org/p/aMXOTgiNHf

答案 4 :(得分:0)

如果您知道您的字符串可以被5整除,那么这也可以是一个解决方案。绝对效率低于其他一些解决方案。

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    fmt.Println(InsertEvery5("HelloWorld", "-"))
}

// Only works if len(str) mod 5 is 0
func InsertEvery5(str string, insert string) string {
    re := regexp.MustCompile(`.{5}`) // Every 5 chars
    parts := re.FindAllString(str, -1) // Split the string into 5 chars blocks.
    return strings.Join(parts, insert) // Put the string back together
}

答案 5 :(得分:0)

我的看法。我需要在长字符串中添加新行(超过一个字符)以包装它们。

func InsertNewLines(s string, n int) string {
    var r = regexp.MustCompile("(.{" + strconv.Itoa(n) + "})")
    return r.ReplaceAllString(s, "$1<wbr />")
}