Go の正規表現境界で非 ASCII 文字を処理するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-10-30 02:24:02
オリジナル
937 人が閲覧しました

 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>
ログイン後にコピー

Runningこのコードは次の結果を生成します:

true
true
true
ログイン後にコピー

最後の行が「révisé」と誤って一致していることに注意してください。

解決策

非対応のケースを処理するにはASCII 文字を使用して、独自のカスタム境界パターンを定義できます。 1 つの方法は、b を次の正規表現に置き換えることです:

(?:\A|\s)(vis)(?:\s|\z)
ログイン後にコピー

このパターンの意味:

  • (?:A|s): 文字列または空白の先頭と一致します。 Character.
  • (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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!