Удаление специальных символов из слов

Я писал в 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])
}
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
4
0
115
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
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)
}

Другие вопросы по теме