我是编程新手,F#是我的第一个.NET语言。
作为初学者的项目,我想创建一个正则表达式查询工具,用于确定用户输入的正则表达式模式是否有效。我被告知我可以使用try-with块来查看正则表达式模式是否编译,但由于我仍然非常不熟悉编程,因此我无法使用this method,因为我不知道什么指定为第二个参数。
谢谢。
编辑:这是我到目前为止的代码:
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'区块目前尚未完成,但我稍后会介绍。谢谢你的帮助。
答案 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"解析" ^ [" - 未终止[]设置。"