在下面的示例代码中,我在正则表达式上过滤了一个字符串列表,知道只能有一个匹配该字符串的条目。然后,我使用相同的匹配字符串从单个剩余值中获取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来获取我想要返回的值?
答案 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.Match
和Match.Success
就足够了。