7 people like it.
Like the snippet!
Using the Regex type provider
There are some nuances to using the regular expression type provider that are easy to miss. This snippet addresses them.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
|
/// First, you must open the FSharpx namespace, not the FSharpx.TypeProviders.Regex
/// namespace or even the FSharpx.TypeProviders namespace. (Or course, if you need
/// to reference the fully-qualified type name in order to disambiguate the Regex
/// type, be aware that it's simply "FSharpx.Regex")
open FSharpx
/// Next, define your Regex type. Remember that you're defining a type (duh!),
/// *not* a let binding:
type NameRegex = Regex< @"(?<firstName>\p{L}+)\s+(?<lastName>\p{L}+)" >
/// Let's define a name to test
let name = "Giuseppe Verdi"
/// To test if the name matches the regular expression, use NameRegex without
/// parentheses to call the IsMatch ( string ) function:
NameRegex.IsMatch name
|> printfn """Name.IsMatch "%s" = %b""" name
/// To parse the name, use NameRegex *with parentheses* to call the Match function. /// (You'll be instantiating a NameRegex object when you do so. Since it's not a
/// singleton, you may want to bind it to a symbol in order not to have to
/// re-instantiate it if you use it again):
NameRegex().Match name
|> (fun m -> printfn """firstName: "%s", lastName: "%s" """ m.firstName.Value m.lastName.Value)
|
namespace FSharpx
type NameRegex = Regex<...>
Full name: Script.NameRegex
First, you must open the FSharpx namespace, not the FSharpx.TypeProviders.Regex
namespace or even the FSharpx.TypeProviders namespace. (Or course, if you need
to reference the fully-qualified type name in order to disambiguate the Regex
type, be aware that it's simply "FSharpx.Regex")
Next, define your Regex type. Remember that you're defining a type (duh!),
*not* a let binding:
type Regex =
inherit Regex
member Options : RegexOptions
member RightToLeft : bool
val capnames : Hashtable
val caps : Hashtable
val capsize : int
val capslist : string []
val factory : RegexRunnerFactory
val pattern : string
val roptions : RegexOptions
...
Full name: FSharpx.Regex
val name : string
Full name: Script.name
Let's define a name to test
Regex<...>.IsMatch(input: string) : bool
Indicates whether the regular expression finds a match in the specified input string
System.Text.RegularExpressions.Regex.IsMatch(input: string, pattern: string) : bool
System.Text.RegularExpressions.Regex.IsMatch(input: string, pattern: string, options: System.Text.RegularExpressions.RegexOptions) : bool
val printfn : format:Printf.TextWriterFormat<'T> -> 'T
Full name: Microsoft.FSharp.Core.ExtraTopLevelOperators.printfn
val m : Regex<...>.MatchType
property Regex<...>.MatchType.firstName: System.Text.RegularExpressions.Group
Gets the "firstName" group from this match
property System.Text.RegularExpressions.Capture.Value: string
property Regex<...>.MatchType.lastName: System.Text.RegularExpressions.Group
Gets the "lastName" group from this match
More information