Я писал в GO функцию для очистки отдельных слов таким образом, чтобы удалять специальные символы в начале и в конце каждого слова.
то есть:
Закончилось следующим, проверив букву за буквой с каждого конца, если они принадлежат набору unicode.Letter, который отлично работает, но мне было интересно, есть ли лучшие или более эффективные способы сделать это? Я экспериментировал со strings.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])
}
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
func TrimFunc(s string, f func(rune) bool) string
TrimFunc возвращает фрагмент строки s со всеми удаленными начальными и конечными кодовыми точками Unicode c, удовлетворяющими f(c).
Другими словами
Вы хотите, чтобы первый 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])
}
Регулярные выражения красивы и лаконичны.
\pL
соответствует любой букве Юникода; \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)
}