regex - 具有拉丁字符的 Golang 正则表达式边界

标签 regex go latin

我有一个关于 golang 正则表达式的小棘手问题。 似乎 \b 边界选项不起作用 当我像这样放置 latein 字符时。

我希望 é 应该被视为常规字符.. 但它被视为边界病房之一。

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

谢谢

最佳答案

问题是 \b 仅适用于 ASCII 字符周围的边界,如文档中所述:

at ASCII word boundary (\w on one side and \W, \A, or \z on the other)

é 不是 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),这意味着“一个非捕获组与一个以下之一:字符串开头、字符串结尾或空格”。您可能想在此处添加其他可能性,例如标点符号。

关于regex - 具有拉丁字符的 Golang 正则表达式边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35192744/

相关文章:

regex - 谷歌表格正则提取每个单词的第一个字母

python - 查找数学表达式中最外层括号内包含的文本

hadoop - 在 pig 中重用变量

hadoop - 在 Pig Latin 中提取文件之间的不匹配记录

regex - 这个查找/替换可以用一个正则表达式完成吗?

Java string.replaceAll() 无法将\R 识别为字符类的一部分

go - 如何释放 slice 分配的内存?

json - 如何为json文档中的现有数据添加新字段?

linux - 在我的服务器上部署和构建我的 go 应用程序

javascript - Pig Latin Translator不会写结果?