2013-03-18 89 views
2

我正在努力創建一個F#函數。我是F#的新手(充其量),真的可以使用一些幫助。我已經澆了一個星期的時間,所以你提供的任何幫助都是無價的!帶有「匹配」和「查找並替換」的F#函數


功能目標:

  • 輸入:一個Liststring
  • 修改會員字符串Proper Case
  • 比較字符串的每個項目在列表
  • 替換任意與清單項目匹配的項目

實施例:

  • 字符串= 「的美元在SC」
  • 列表= [ 「NIF」; 「PF」; 「PS」; 「SC」; 「我們」; 「美國」; 「USD」]

功能操作:

  1. 設置串到適當的大小寫=「美元在SC」
  2. 比較字符串與每個項目列表中,並替換爲適當
    • 「我們」 變成 「美國」
    • 「SC」 變成了 「SC」
  3. 最終的結果是「在SC美元」

這是我迄今。

let myList = ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"] 
let FixAccronyms aList fixString= 
    aList |> List.iter 
     (fun listItem -> 
     match listItem with    
     | fixString -> printfn "%s, %s" listItem fixString 
     | _ -> printf "%s" "" |> ignore) 

在FSI:

FixAccronyms myList中 「美元在SC」 ;;

該函數遍歷列表,但它打印列表中的每個項目,而不僅僅是匹配fixString的位置。假設工作,我既不知道如何模式相匹配的字符串的一部分,也不做一個查找和字符串內更換...


結果FSI

val myList2 : string list = ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"] 
val FixAccronyms2 : aList:string list -> fixString:'a -> unit 

>FixAccronyms2 myList2 "the us dollar in sc";; 
NIF, NIF 
PF, PF 
PS, PS 
SC, SC 
US, US 
USA, USA 
USD, USD 
val it : unit =() 

謝謝提前!

回答

1

這裏做另一種方式:

open System 
open System.Text.RegularExpressions 

let properCase lookup str = 
    Regex.Replace(str, String.Join("|", Seq.map Regex.Escape lookup), 
     (fun (x : Match) -> x.Value.ToUpper()), 
     RegexOptions.IgnoreCase) 

用法是一樣@丹尼爾的回答。

1

這裏有一種方法:

open System 
open System.Collections.Generic 

let properCase lookup (str: string) = 
    let lookupDict = Dictionary(StringComparer.CurrentCultureIgnoreCase) 
    for word in lookup do lookupDict.Add(word, word) 
    (str, str.Split()) ||> Array.fold (fun pcWord word -> 
    match lookupDict.TryGetValue(word) with 
    | true, s -> pcWord.Replace(word, s) 
    | _ -> pcWord) 

> properCase ["NIF"; "PF"; "PS"; "SC"; "US"; "USA"; "USD"] "The us dollar in sc" 
val it : string = "The US dollar in SC" 
+0

謝謝大家的回覆!我從來沒有想過爲相同的結果獲得三種獨特的方法。而且,你們都沒有接近我「認爲」將會是答案的地方。我期望通過迭代列表完成某種類型的匹配。 但是,我問你:我怎麼知道這些庫?這只是經驗還是有方法可以找到解決問題的庫或方法? – Uziel 2013-03-20 00:18:09