应用过滤器获取单个项目并使用过滤器函数转换结果

时间:2012-07-04 21:24:01

标签: f#

在下面的示例代码中,我在正则表达式上过滤了一个字符串列表,知道只能有一个匹配该字符串的条目。然后,我使用相同的匹配字符串从单个剩余值中获取2个分组值。

let input = ["aaaa bbbb";"aaabbbb";"cccc$$$$";"dddddda";" "] 

let ValuesOfAB (input: string list) = 
    let matchString = "(?<a>\w+)\s(?<b>\w+)"

    let value = input |> List.filter (fun line -> Regex.Matches(line, matchString).Count <> 0) 
                      |> List.head
    (Regex.Matches(value, matchString).[0].Groups.["a"].Value, Regex.Matches(value, matchString).[0].Groups.["b"].Value)

let a = ValuesOfAB input

有没有更好的方法,我不必再次在同一个字符串上使用Regex.Matches来获取我想要返回的值?

1 个答案:

答案 0 :(得分:3)

使用List.pick

let input = ["aaaa bbbb";"aaabbbb";"cccc$$$$";"dddddda";" "] 

let valuesOfAB (input: string list) = 
    let matchString = "(?<a>\w+)\s(?<b>\w+)"
    let v = input |> List.pick (fun line -> let m = Regex.Match(line, matchString)
                                            if m.Success then Some m else None)
    v.Groups.["a"].Value, v.Groups.["b"].Value

let a = valuesOfAB input

说明:

您希望匹配列表中的第一个字符串并返回Match对象,以便您不必再次运行Regex。 List.pick非常适合这项任务。

对于每个字符串,您至少需要匹配一次,因此Regex.MatchMatch.Success就足够了。