F # Матч много регулярных выражений - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть строка, которая, как я знаю, будет соответствовать одному (и только одному) из трех регулярных выражений.Я хочу попробовать каждое регулярное выражение по очереди, пока совпадение не будет найдено.Для двух регулярных выражений достаточно знать, что есть совпадение.Третье регулярное выражение имеет группу захвата и возвращает целое число.У меня есть активный шаблон для регулярных выражений:

let (|Regex|_|) pattern input =
    let m = Regex.Match(input, pattern)
    if m.Success then Some(List.tail [ for g in m.Groups -> g.Value ])
    else None

Я новичок в F # и борюсь за идиоматический способ сделать это.Я действительно не хочу делать запутанное выражение «если-то-еще», любая помощь будет очень признательна.

Спасибо

1 Ответ

0 голосов
/ 17 декабря 2018

С вашей удобной функцией все, что вам нужно сделать, это использовать match с вашими 3 шаблонами:

let regex1 = "^[1234]+$"
let regex2 = "^[abcd]+$"
let regex3 = "^ab([123])$"

let testText v =
    match v with
    | Regex regex1   _   ->         "matched 1!"
    | Regex regex2   _   ->         "matched 2!" 
    | Regex regex3 [ v ] -> sprintf "matched 3 = %d" (int v)
    | _                  ->         "no match"

testText "231" |> print  // matched 1!
testText "abd" |> print  // matched 2!
testText "ab2" |> print  // matched 3 = 2
testText "ab5" |> print  // no match
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...