非 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) を利用して、次のいずれかと一致します。次の文字:
これは b の動作を模倣しますが、非 ASCII 文字が含まれます潜在的な単語境界として。これらのコンポーネントを組み合わせることで、周囲の文字に関係なく、単語の先頭または末尾の「vis」と正常に一致します。
以上がGo の正規表現 \\b 境界が非 ASCII 文字で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。