\b Границы с латинскими символами в Go Regex
В мире регулярных выражений Go опция \b border имеет небольшую особенность при работе с латинскими символами. Проблема возникает при попытке определить слова, содержащие латинские символы, такие как ударные гласные и специальные символы.
Рассмотрим следующий пример, в котором мы хотим сопоставить слово «vis», используя параметр границы \b:
import (
"fmt"
"regexp"
)
func main() {
r, _ := regexp.Compile(`\b(vis)\b`)
fmt.Println(r.MatchString("re vis e"))
fmt.Println(r.MatchString("revise"))
fmt.Println(r.MatchString("révisé"))
}
Удивительно, но ожидаемого результата сопоставления «revisé» как false не происходит. Вместо этого оно соответствует истине. Это связано с тем, что \b работает только с границами слов ASCII.
Чтобы решить эту проблему и точно сопоставить латинские символы, мы можем заменить границу \b более инклюзивной альтернативой. Вот пример:
import (
"fmt"
"regexp"
)
func main() {
r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`)
fmt.Println(r.MatchString("vis"))
fmt.Println(r.MatchString("re vis e"))
fmt.Println(r.MatchString("revise"))
fmt.Println(r.MatchString("révisé"))
}
Благодаря этой модификации регулярное выражение теперь распознает начало и конец слов, используя комбинацию начала строки (\A), конца строки (\z) и пробела (\s). Результат точно соответствует «vis» как true и «révisé» как false:
true true false false
Этот метод обеспечивает точное совпадение слов независимо от наличия латинских символов.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3