2015-03-19 50 views
0

我是編程新手,F#是我的第一個.NET語言。F#:Try-with block用於檢查正則表達式模式是否有效

作爲一個初學者的項目,我想創建一個正則表達式查詢工具,它將確定用戶輸入的正則表達式模式是否有效。我被告知,我可以通過try-with塊來查看是否編譯正則表達式模式,但由於我對編程通常還是非常陌生,所以我無法使用this method,因爲我不知道指定什麼第二個參數。

  1. 我在尋找正確的方法嗎?
  2. 一個更有經驗的程序員能告訴我如何編寫一個能完成剛纔描述的任務的函數嗎?

謝謝。

編輯:這裏是我的代碼至今:

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 

我的問題是不知道如何完成試穿用塊。 'else'塊目前尚未完成,但我會稍後再討論。感謝您的幫助。

+0

你到目前爲止嘗試過什麼?爲什麼它不起作用?你能否提供一個[簡短,獨立,正確,可編輯的例子](http://sscce.org)? – 2015-03-19 09:22:54

+0

@MarkSeemann,我現在用一個例子來編輯我的帖子。 – 2015-03-19 09:24:58

+0

您是否閱讀過最後一個問題的完整答案(自編輯以來)?它似乎解決您的問題 – 2015-03-19 09:28:00

回答

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「parsing」^ [「 - Unterminated [] set。」

+0

我也建議將函數的名稱改爲'isRegexValid',因爲您不需要文本來檢查您的正則表達式。 – 2015-03-19 10:00:22

相關問題