首页 > 后端开发 > Golang > 正文

如何处理 Go 正则表达式边界中的非 ASCII 字符?

Susan Sarandon
发布: 2024-10-30 02:24:02
原创
936 人浏览过

 How to Handle Non-ASCII Characters in Go's Regular Expression Boundaries?

Golang 正则表达式边界和非 ASCII 字符

Go 的正则表达式边界(b)旨在匹配 ASCII 字符和非 ASCII 字符之间的边界非 ASCII 字符。但是,在某些情况下,当涉及拉丁字符时,它可能不会按预期运行。

问题

在 Go 中,b 边界仅在包围 ASCII 时才起作用人物。例如,正则表达式 b(vis)b 旨在匹配单词“vis”。然而,当单词“vis”包含拉丁字符时,例如“révisé”,b 无法将其识别为单词边界。

考虑以下 Go 代码:

<code class="go">package main

import (
    "fmt"
    "regexp"
)

func main() {
    r, _ := regexp.Compile(`\b(vis)\b`)
    fmt.Println(r.MatchString("re vis e")) // Expected true
    fmt.Println(r.MatchString("revise"))  // Expected true
    fmt.Println(r.MatchString("révisé")) // Expected false
}</code>
登录后复制

运行此代码产生:

true
true
true
登录后复制

注意最后一行错误地匹配“révisé”。

解决方案

处理非以下情况ASCII 字符,您可以定义自己的自定义边界图案。一种方法是将 b 替换为以下正则表达式:

(?:\A|\s)(vis)(?:\s|\z)
登录后复制

此模式意味着:

  • (?:A|s):匹配字符串的开头或空格字符。
  • (vis):捕获单词“vis”。
  • (?:s|z):匹配空白字符或字符串末尾。

此自定义边界有效地实现了 b 对 ASCII 字符所做的操作,但它也扩展到了非 ASCII 字符,例如拉丁字符。

通过将此自定义模式合并到正则表达式中,您可以获得所需的结果:

<code class="go">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é"))
}</code>
登录后复制

运行此代码现在会给出:

true
true
false
false
登录后复制

如您所见,“révisé”被正确排除为匹配项。

以上是如何处理 Go 正则表达式边界中的非 ASCII 字符?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!