F#:用于检查正则表达式模式是否有效的 Try-with 块
F#: Try-with block for checking whether a regex pattern is valid
我是编程新手,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' 块目前未完成,但我会稍后再做。感谢您的帮助。
您实际上不必针对字符串测试正则表达式来查看它是否有效。我的意思是如果你想检查模式是否有效(不是字符串)。您可以简单地实例化一个新的 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 "parsing "^[" - Unterminated [] set."
我是编程新手,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' 块目前未完成,但我会稍后再做。感谢您的帮助。
您实际上不必针对字符串测试正则表达式来查看它是否有效。我的意思是如果你想检查模式是否有效(不是字符串)。您可以简单地实例化一个新的 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 "parsing "^[" - Unterminated [] set."