ホームページ  >  記事  >  バックエンド開発  >  Go の正規表現 \\b 境界が非 ASCII 文字で失敗するのはなぜですか?

Go の正規表現 \\b 境界が非 ASCII 文字で失敗するのはなぜですか?

DDD
DDDオリジナル
2024-10-29 00:26:02741ブラウズ

Why Does Go's Regex \b Boundary Fail with Non-ASCII Characters?

非 ASCII 文字による Golang 正規表現境界の問題

Go では、b 境界オプションは ASCII 文字の境界に一致することが期待されます、é などのアクセント文字は除きます。この動作により、非 ASCII 文字を含む文字列を操作する場合に予期しない結果が生じる可能性があります。たとえば、次のコードを考えてみましょう。

<code class="go">package main

import (
    "fmt"
    "regexp"
)

func main() {
    r, _ := regexp.Compile(`\b(vis)\b`)
    fmt.Println(r.MatchString("re vis e")) // True
    fmt.Println(r.MatchString("revise")) // False
    fmt.Println(r.MatchString("révisé")) // True
}</code>

この例では、b(vis)b 正規表現は単語境界で部分文字列「vis」と一致します。ただし、「révisé」に適用すると、é は単語文字とみなされないため、誤って True が返されます。この問題に対処するには、別のアプローチを採用できます。

<code class="go">r, _ := regexp.Compile(`(?:\A|\s)(vis)(?:\s|\z)`)
fmt.Println(r.MatchString("vis")) // True
fmt.Println(r.MatchString("re vis e")) // True
fmt.Println(r.MatchString("revise")) // False
fmt.Println(r.MatchString("révisé")) // False</code>

このソリューションでは、非キャプチャ グループ (?:A|s)(vis)(?:s|z) を利用して、次のいずれかと一致します。次の文字:

  • 文字列の先頭 (A)
  • 空白 (s)

これは b の動作を模倣しますが、非 ASCII 文字が含まれます潜在的な単語境界として。これらのコンポーネントを組み合わせることで、周囲の文字に関係なく、単語の先頭または末尾の「vis」と正常に一致します。

以上がGo の正規表現 \\b 境界が非 ASCII 文字で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。