1. ホーム
  2. regex

[解決済み] Goの正規表現でキャプチャグループ機能を取得する方法

2023-04-29 04:10:55

質問

Ruby から Go にライブラリを移植しているのですが、Ruby の正規表現が Go と互換性がないことがわかりました (RE2 でググってみてください)。Ruby & Java (さらに、他の言語は PCRE 正規表現 (グループをキャプチャすることをサポートする perl 互換) を使用します) であることに気づいたので、Go でコンパイルできるように私の式を書き直す必要があります。

たとえば、次のような正規表現があります。

`(?<Year>\d{4})-(?<Month>\d{2})-(?<Day>\d{2})`

といった入力を受け付けるようにします。

2001-01-20

キャプチャグループにより、年、月、日を変数にキャプチャすることができます。各グループの値を取得するのは非常に簡単で、返されたマッチングデータにグループ名を添えたインデックスを作成すれば、その値が返されます。つまり、例えば年を取得するには、以下のような擬似的なコードになります。

m=expression.Match("2001-01-20")
year = m["Year"]

これは私が表現でよく使うパターンなので、書き直しが多いのです。

Go regexpでこのような機能を実現する方法はありますか?

どのように解決するのですか?

これらの式はどのように書き直せばよいのでしょうか?

Psを追加してください。 ここで :

(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2})

キャプチャグループ名を re.SubexpNames() .

そして を次のように使用します。 :

package main

import (
    "fmt"
    "regexp"
)

func main() {
    r := regexp.MustCompile(`(?P<Year>\d{4})-(?P<Month>\d{2})-(?P<Day>\d{2})`)
    fmt.Printf("%#v\n", r.FindStringSubmatch(`2015-05-27`))
    fmt.Printf("%#v\n", r.SubexpNames())
}