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>
Runningこのコードは次の結果を生成します:
true true true
最後の行が「révisé」と誤って一致していることに注意してください。
解決策
非対応のケースを処理するにはASCII 文字を使用して、独自のカスタム境界パターンを定義できます。 1 つの方法は、b を次の正規表現に置き換えることです:
(?:\A|\s)(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 中国語 Web サイトの他の関連記事を参照してください。