Go to active patterns:
let (|Match|_|) pattern input =
let m = Regex.Match(input, pattern, RegexOptions.Singleline)
if m.Success
then Some (m.Groups.[0])
else None
match x with
| Match @"a text" a ->
printfn "found a: %s" a
| Match @"b text" b ->
printfn "found b: %s" b
You can go even further and create an active template that supports its own number of analyzed values:
let (|Regex|_|) pattern input =
let m = Regex.Match(input, pattern, RegexOptions.Singleline)
if m.Success
// List.tail is needed to skip the m.Groups.[0] that returns the entire parsed scope
then [ for g in m.Groups -> g.Value ] |> List.tail |> Some
else None
match x with
| Regex @"a (\w+)\s(\w+)" [ a1; a2 ] ->
printfn "found A value: %s and %s" a1 a2
| Regex @"b (\w+)\s(\w+)\s(\w+)" [ b1; b2; b3 ] ->
printfn "found B value: %s and %s and %s" b1 b2 b3
// this will be able to parse the following:
// "a foo bar" ==> a1="foo" and a2="bar"
// "b foo bar baz" ==> b1="foo", b2="bar", and b3="baz"
source
share