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

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

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

возможно ли это с помощью одного регулярного выражения, с поддержкой unicode для международных символов пробела и т. д.?

3 ответов


кажется, что вы можете использовать оба \s класс символов стенографии и \p{Zs} свойство Unicode для соответствия пробелам Unicode. Однако оба шага не могут быть выполнены с заменой 1 regex, поскольку вам нужны две разные замены и 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)
}

вы можете получить довольно далеко просто использовать 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 !"

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

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

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