F#:Try-with块用于检查正则表达式模式是否有效

时间:2015-03-19 08:54:31

标签: regex f#

我是编程新手,F#是我的第一个.NET语言。

作为初学者的项目,我想创建一个正则表达式查询工具,用于确定用户输入的正则表达式模式是否有效。我被告知我可以使用try-with块来查看正则表达式模式是否编译,但由于我仍然非常不熟悉编程,因此我无法使用this method,因为我不知道什么指定为第二个参数。

  1. 我在看正确的方法吗?
  2. 一位经验丰富的程序员能告诉我如何编写一个完成我刚才描述的任务的函数吗?
  3. 谢谢。

    编辑:这是我到目前为止的代码:

    open System
    open System.IO
    open System.Text.RegularExpressions
    
    let askUserForFilePath() =
        Console.WriteLine("Please enter the file (extension: .txt) from which to read all lines: ")
        let filePath = Console.ReadLine()
        filePath
    
    let askUserForRegexPattern() =
        Console.WriteLine("Please enter a regular expression: ")
        let regExp = Console.ReadLine()
        regExp
    
    let getLinesFromFile (filePath: string) =
        let linesFromFile = File.ReadAllLines filePath
        linesFromFile 
        |> Array.reduce (+)
        |> string
    
    let matchTextAgainstRegex (text: string) (regExp: string) =
        try 
            Regex.IsMatch(text, regExp)
        with
    
        if Regex.IsMatch(text, regExp) then
            let matchResults = Regex.Match(text, regExp)
            let stringsFound = []
            for eachGroup in matchResults.Groups do
                eachGroup.Value :: stringsFound |> ignore
            stringsFound 
            |> List.rev
            |> List.iter (fun eachString -> printfn "%s" eachString)
        else 
    

    我的问题是不知道如何完成try-with块。 'else'区块目前尚未完成,但我稍后会介绍。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您实际上不必对字符串测试正则表达式以查看它是否有效。我的意思是,如果你想检查模式是否有效(不是字符串)。您可以简单地实例化一个新的Regex对象并捕获异常。

type MatchResult =
| Ok
| Error of string

let matchTextAgainstRegex (regExp: string) (opt : RegexOptions) =
    try 
        let r = Regex(regExp, opt);
        Ok
    with
        | e -> Error(e.Message)

请注意,我引入了一个类型MatchResult,以便在从matchTextAgainstRegex函数返回时可以匹配它。我也改变了签名

因此,当您使用无效模式调用它时,输出结果为:

  

matchTextAgainstRegex @" ^ [" RegexOptions.IgnoreCase ;;

     

val it:MatchResult = Error"解析" ^ [" - 未终止[]设置。"