斯卡拉模式匹配

时间:2017-10-07 14:00:57

标签: regex scala pattern-matching

我正在使用regexlib.com的这种模式匹配 -

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

这似乎工作正常=>

val RE = """^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$""".r
RE.findAllMatchIn("31/12/2003 11:59:59 PM").foreach(println) //prints 31/12/2003 11:59:59 PM
RE.findAllMatchIn("31/122003 11:59:59 PM").foreach(println) //prints nothing

但是,我无法像这样直接匹配 -

"31/12/2003 11:59:59 PM" match {
    case RE(_) => println("Yes")
    case _ => println("No")
}

打印“否”。我期待“是”

1 个答案:

答案 0 :(得分:3)

这是由于捕获组在模式中有几个。您需要在第一种情况下使用RE(_*)来检查字符串是否匹配而不提取捕获组:

val RE = """^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$""".r
    "31/12/2003 11:59:59 PM" match {
        case RE(_*) => println("Yes")
        case _ => println("No")
    }

请参阅Scala demo