Как удалить избыточные пробелы/пробелы из строки в Голанге?

Мне было интересно, как удалить:

  • Все ведущие/конечные символы пробелов или новых строк, нулевые символы и т.д.
  • Любые избыточные пробелы внутри строки (например, "hello [space] [space] world" будут преобразованы в "hello [space] world" )

Возможно ли это с одним Regex, с поддержкой Unicode для международных символов пространства и т.д.?

Ответ 1

Возможно, вы захотите использовать как класс сокращенных символов \s свойство \p{Zs} Unicode для сопоставления пробелов Unicode. Тем не менее, оба шага не могут быть выполнены с одной заменой регулярного выражения, так как вам нужны две разные замены, а ReplaceAllStringFunc допускает только целую строку соответствия в качестве аргумента (я понятия не имею, как проверить, какая группа соответствует).

Таким образом, я предлагаю использовать два регулярных выражения:

  • ^[\s\p{Zs}]+|[\s\p{Zs}]+$ - для соответствия всем начальным/конечным пробелам
  • [\s\p{Zs}]{2,} - для сопоставления 2 или более пробельных символов внутри строки

Образец кода:

package main

import (
    "fmt"
    "regexp"
)

func main() {
    input := "   Text   More here     "
    re_leadclose_whtsp := regexp.MustCompile('^[\s\p{Zs}]+|[\s\p{Zs}]+$')
    re_inside_whtsp := regexp.MustCompile('[\s\p{Zs}]{2,}')
    final := re_leadclose_whtsp.ReplaceAllString(input, "")
    final = re_inside_whtsp.ReplaceAllString(final, " ")
    fmt.Println(final)
}

Ответ 2

Вы можете получить довольно далеко, используя пакет strings, поскольку strings.Fields выполняет большую часть работы для вас:

package main

import (
    "fmt"
    "strings"
)

func standardizeSpaces(s string) string {
    return strings.Join(strings.Fields(s), " ")
}

func main() {
    tests := []string{" Hello,   World  ! ", "Hello,\tWorld ! ", " \t\n\t Hello,\tWorld\n!\n\t"}
    for _, test := range tests {
        fmt.Println(standardizeSpaces(test))
    }
}
// "Hello, World !"
// "Hello, World !"
// "Hello, World !"

Ответ 3

strings.Fields() разбивает на любое количество пробелов, таким образом:

strings.Join(strings.Fields(strings.TrimSpace(s)), " ")

Ответ 4

Используйте regexp для этого.

func main() {
    data := []byte("   Hello,   World !   ")
    re := regexp.MustCompile("  +")
    replaced := re.ReplaceAll(bytes.TrimSpace(data), []byte(" "))
    fmt.Println(string(replaced))
    // Hello, World !
}

Чтобы также обрезать новые строки и нулевые символы, вы можете использовать функцию bytes.Trim(src []byte, cutset string) вместо bytes.TrimSpace