Partial Active Patterns
引数で受けた正規表現を評価して、ヒットしたら返します。
習作として作りました。
使い方
アクティブパターンなので、パターンマッチの内部でリストから取り出すイメージですね。
マッチしなければ次のパターン(この例では| _ -> ()
の行)に評価が移ります。
今回はデモなのでリストをそのまま出力しています。
open RegExp let testString = "abc123def456ghi789" let testPattern = @"(?<name>[a-z])+(?<number>[0-9])+" // 単純なマッチ match testString with | Match testPattern result -> printfn "%A" result | _ -> () // 単純なマッチの集合 match testString with | Matches testPattern result -> printfn "%A" result | _ -> () // 名前付きマッチ match testString with | NamedMatch testPattern result -> printfn "%A" result | _ -> () // 名前付きマッチの集合 match testString with | NamedMatches testPattern result -> printfn "%A" result | _ -> () (* 上記 result の部分もパターンマッチなので、 うまいことリストのリテラルを書いて受けると、そのままリストの中身を取り出すこともできます。 参考にしたMicrosoft Docsのドキュメントにはこの方法が書かれています。 *) match testString with | Match testPattern [e1; e2] -> printfn "e1: '%s'\ne2: '%s'" e1 e2 | _ -> ()
出力
// 単純なマッチ ["c"; "3"] // 単純なマッチの集合 [["c"; "3"]; ["f"; "6"]; ["i"; "9"]] // 名前付きマッチ map [("name", "c"); ("number", "3")] // 名前付きマッチの集合 [map [("name", "c"); ("number", "3")] map [("name", "f"); ("number", "6")] map [("name", "i"); ("number", "9")]] // 下のリストで受けたやつ e1: 'c' e2: '3'
これだけあれば、とりあえずはだいたいのニーズを満たせるのではないかと思います。
参考: Active Patterns (F#) | Microsoft Docs
追記
名前付きマッチの返り値をMap
にしました。
添え字でアクセスできるようになります。