Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex F#:尝试使用block检查正则表达式模式是否有效_Regex_F# - Fatal编程技术网

Regex F#:尝试使用block检查正则表达式模式是否有效

Regex F#:尝试使用block检查正则表达式模式是否有效,regex,f#,Regex,F#,我是编程新手,F#是我的第一种.NET语言 作为一个初学者项目,我想创建一个regex查询工具,用于确定用户输入的regex模式是否有效。有人告诉我,我可以使用try-with块来查看regex模式是否可以编译,但由于我仍然非常不熟悉一般的编程,所以我很难使用,因为我不知道指定什么作为第二个参数 我在看正确的方法吗 有经验的程序员能告诉我如何编写一个函数来完成我刚才描述的任务吗 多谢各位 编辑:以下是我目前掌握的代码: open System open System.IO open System

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

作为一个初学者项目,我想创建一个regex查询工具,用于确定用户输入的regex模式是否有效。有人告诉我,我可以使用try-with块来查看regex模式是否可以编译,但由于我仍然非常不熟悉一般的编程,所以我很难使用,因为我不知道指定什么作为第二个参数

  • 我在看正确的方法吗
  • 有经验的程序员能告诉我如何编写一个函数来完成我刚才描述的任务吗
  • 多谢各位

    编辑:以下是我目前掌握的代码:

    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”块目前尚未完成,但我将稍后再处理。感谢您的帮助。

    实际上,您不必根据字符串测试正则表达式是否有效。我的意思是,如果您想检查模式是否有效(而不是字符串)。您可以简单地实例化一个新的
    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=错误“正在分析”^[“-未终止[]集。”


    到目前为止你尝试了什么?为什么不起作用?你能提供一个答案吗?@MarkSeemann,我现在就用一个例子来编辑我的帖子。你读过你上一个问题的完整答案了吗(因为它被编辑了)?它似乎解决了你的问题problem@MY_G“我的问题是不知道如何完成try with块。”如果出现异常,您希望代码做什么?@JohnPalmer--谢谢您通知我。我错过了。我还建议将函数名称更改为类似
    isRegexValid
    ,因为您不再需要文本来检查正则表达式。