2016-02-04 2 views
2

У меня есть небольшая сложная проблема с регулярным выражением golang. похоже \b boundering опция не работает когда я поместил latein chars подобный это.Golang regexp Граница с латинским символом

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

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?

Спасибо

+0

Да, границы слова '\ b' поддерживают только ASCII - документы говорят' на границе слова ASCII (\ w на одной стороне и \ W, \ A или \ z на другом) '. Единственный вариант, возможно, явно соответствует символам, которые вы считаете границей слов в регулярном выражении (пробелы, новые строки, полные остановки, конец строки и т. Д.) –

ответ

2

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

на ASCII границе слова (\ ш, с одной стороны, и \ 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é")) 
} 

Running this дает:

true 
true 
false 
false 

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

+0

Спасибо, herman! да, это работает для этих случаев! – toshipon

+0

Это отлично работает. Включение пунктуации в конце выглядит следующим образом: '(?: [[: Punct:]] | \ s | \ z)' – thebaer

Смежные вопросы