我想知道如何删除:
这是否可以使用单个正则表达式,对国际空间字符支持unicode等?
答案 0 :(得分:43)
您只需使用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 !"
答案 1 :(得分:17)
您似乎可能希望同时使用\s
速记字符类和\p{Zs}
Unicode属性来匹配Unicode空格。但是,由于需要两个不同的替换,因此无法使用1个正则表达式替换执行这两个步骤,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 :(得分:1)
strings.Fields()在任意数量的空格上分割,因此:
strings.Join(strings.Fields(strings.TrimSpace(s)), " ")
答案 3 :(得分:0)
避免浪费时间的正则表达式或外部库
我选择使用普通的golang而不是regexp,因为每种语言都有一些不是ASCII的特殊字符。
去Golang!
func RemoveDoubleWhiteSpace(str string) string {
var b strings.Builder
b.Grow(len(str))
for i := range str {
if !(str[i] == 32 && (i+1 < len(str) && str[i+1] == 32)) {
b.WriteRune(rune(str[i]))
}
}
return b.String()
}
及相关测试
func TestRemoveDoubleWhiteSpace(t *testing.T) {
data := []string{` test`, `test `, `te st`}
for _, item := range data {
str := RemoveDoubleWhiteSpace(item)
t.Log("Data ->|"+item+"|Found: |"+str+"| Len: ", len(str))
if len(str) != 5 {
t.Fail()
}
}
}
答案 4 :(得分:0)
使用单个 regexp 使用 regexp.MustCompile() 抓取所有空格并将它们替换为单个空格,最后修剪前导空格。
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)
}
答案 5 :(得分:-1)
使用正则表达式。
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