package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
input := " Text More here "
re := regexp.MustCompile(`\s+`)
out := re.ReplaceAllString(input, " ")
out = strings.TrimSpace(out)
fmt.Println(out)
}
或者,使用“_”代替空格。
package main
import (
"fmt"
"regexp"
"strings"
)
func main() {
input := "___Text___More_here______"
re := regexp.MustCompile(`_+`)
out := re.ReplaceAllString(input, "_")
out = strings.Trim(out, "_")
fmt.Println(out)
}
7条答案
按热度按时间2vuwiymt1#
仅仅使用
strings
包就可以完成很多工作,因为strings.Fields
为您完成了大部分工作:iszxjhcz2#
看起来你可能想同时使用
\s
速记字符类和\p{Zs}
Unicode属性来匹配Unicode空间。但是,这两个步骤不能用一个正则表达式替换来完成,因为你需要两个不同的替换,并且ReplaceAllStringFunc
只允许整个匹配字符串作为参数(我不知道如何检查哪个组匹配)。因此,我建议使用两个正则表达式:
^[\s\p{Zs}]+|[\s\p{Zs}]+$
-匹配所有前导/尾随空格[\s\p{Zs}]{2,}
-匹配字符串中的2个或多个空白符号样本代码:
wgeznvg73#
strings.Fields()在任意数量的白色上进行拆分,因此:
dffbzjpn4#
使用单个regexp,使用regexp.MustCompile()抓取所有空格,并将它们替换为单个空格,最后修剪前导空格。
或者,使用“_”代替空格。
hc2pp10m5#
避免使用浪费时间的regexp或外部库
我选择使用普通golang而不是regexp,因为在每种语言中都有一些特殊字符不是ASCII。
加油!
及相关试验
nukf8bse6#
对上述3个函数进行基准测试,@ifross的method using
strings.Fields
function比公认的答案和使用正则表达式要快得多。因此,我更喜欢
strings.Fields
和strings.Join
的组合,只是为了减少字符串中冗余和重复的空格。第一次
goqiplq27#
请使用regexp执行此操作。
为了同时修剪换行符和空字符,可以使用
bytes.Trim(src []byte, cutset string)
函数代替bytes.TrimSpace