Граница регулярного выражения Golang с латинским символом

У меня есть небольшая проблема с регулярным выражением golang. кажется, что опция ограничения \b не работает, когда я помещаю латинские символы, подобные этому.

Я ожидал, что é следует рассматривать как обычный символ... но он рассматривается как один из ограничивающих вардов.

package main

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é"))
}

результат был:

true 
false 
true

Пожалуйста, дайте мне какое-нибудь предложение, как поступить с r.MatchString("révisé") как false?

Спасибо


person toshipon    schedule 04.02.2016    source источник
comment
Да, границы слов \b поддерживают только ASCII — в документах указано at ASCII word boundary (\w on one side and \W, \A, or \z on the other). Единственным вариантом, вероятно, является явное сопоставление символов, которые вы считаете границей слова в регулярном выражении (пробелы, новые строки, точки, конец строки и т. д.)   -  person Herman Schaaf    schedule 04.02.2016


Ответы (1)


Проблема в том, что \b предназначен только для границ вокруг символов ASCII, как указано в документах:

на границе слова ASCII (\w с одной стороны и \W, \A или \z с другой)

И é не ASCII. Но вы можете сделать свою собственную замену \b, комбинируя другие ярлыки регулярных выражений. Вот простое решение, которое решает случай, указанный в вопросе, хотя вы можете добавить более тщательное сопоставление:

package main

import (
    "fmt"
    "regexp"
)

func main() {   
    r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`)
    fmt.Println(r.MatchString("vis")) // added this case
    fmt.Println(r.MatchString("re vis e"))
    fmt.Println(r.MatchString("revise"))
    fmt.Println(r.MatchString("révisé"))
}

Запуск этого дает:

true
true
false
false

Это решение, по сути, заменяет \b на (?:\A|\z|\s), что означает «группу без захвата с одним из следующих: начало строки, конец строки или пробел». Вы можете добавить сюда другие возможности, например пунктуацию.

person Herman Schaaf    schedule 04.02.2016
comment
Это прекрасно работает. Включение знаков препинания в конце выглядит так: (?:[[:punct:]]|\s|\z) - person thebaer; 11.01.2018