Go语言 删除单词中的特殊字符

4jb9z9bj  于 2023-04-18  发布在  Go
关注(0)|答案(3)|浏览(175)

我在GO中写了一个函数来清理单个单词,以这种方式,每个单词开头和结尾的特殊字符将被删除。
即:

  • .-你好,-〉你好
  • “背靠背”-〉背靠背

最后,通过从每一端逐个字母地检查它们是否属于unicode。Letter set,这很好用,但我想知道是否有更好或更有效的方法来做到这一点?我尝试了字符串。TrimLeft/Right,但然后我必须定义自己的字符集来删除。使用预定义的集合会很好。

func TrimWord(word []rune) string {
    var prefix int = 0
    var suffix int = len(word)

    for x := 0; x < len(word); x++ {
        if !unicode.IsLetter(word[x]) {
            prefix++
        } else {
            break
        }
    }

    for x := len(word) - 1; x >= 0; x-- {
        if suffix == prefix {
            break
        }
        if !unicode.IsLetter(word[x]) {
            suffix--
        } else {
            break
        }
    }
    return string(word[prefix:suffix])
}
r9f1avp5

r9f1avp51#

package main

import (
    "fmt"
    "strings"
    "unicode"
)

func trimWord(s string) string {
    return strings.TrimFunc(s, func(r rune) bool {
        return !unicode.IsLetter(r)
    })
}

func main() {
    fmt.Println(trimWord(`.-hello,`))       // -> hello
    fmt.Println(trimWord(`"back-to-back"`)) // -> back-to-back
}

https://go.dev/play/p/l1A4hBDvFfr

hello
back-to-back

Package strings

func TrimFunc(s string, f func(rune) bool) string

TrimFunc返回字符串s的一个切片,其中删除了所有满足f(c)的前导和尾随Unicode代码点c。

fnvucqvd

fnvucqvd2#

换句话说
您希望第一个unicode.letter到最后一个unicode.letter
如果你不在乎,仍然用同样的方法来获得结果,你会得到很小的改善

func TrimWord(word []rune) string {
    var prefix int = 0
    var suffix int = len(word)

    for ; prefix < suffix;prefix++{
        if unicode.IsLetter(word[prefix]) {
            break
        }
    }
    suffix--
    for ; suffix > prefix;suffix--{
        if unicode.IsLetter(word[suffix]) {
            break
        }
    }
    return string(word[prefix:suffix+1])
}
ivqmmu1c

ivqmmu1c3#

正则表达式很好很简洁。
\pL匹配任何Unicode字母;\PL是相同的匹配否定(匹配任何 * 除了 * 一个Unicode字母)。
https://goplay.tools/snippet/SrezNxxawW7

package main

import (
    "fmt"
    "regexp"
)

func main() {
  rx := regexp.MustCompile(`^\PL+|\PL+$`)
  input := "<'foobar'>"
  trimmed := rx.ReplaceAllString(input, "")

  fmt.Println(trimmed)
}

相关问题