Как удалить избыточные пробелы/пробелы из строки в Голанге?
Мне было интересно, как удалить:
- Все ведущие/конечные символы пробелов или новых строк, нулевые символы и т.д.
- Любые избыточные пробелы внутри строки (например, "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