具有拉丁字符的 Golang 正则表达式边界
Golang regexp Boundary with Latin Character
我有一个关于 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
的建议?
谢谢
问题是 \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)
,即 "a non-capturing group with one of the following: start of string, end of string or whitespace"。您可能想在此处添加其他可能性,例如标点符号。
我有一个关于 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
的建议?
谢谢
问题是 \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)
,即 "a non-capturing group with one of the following: start of string, end of string or whitespace"。您可能想在此处添加其他可能性,例如标点符号。