regex - Scala 模式匹配

标签 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")
}

这会打印“否”。我期待"is"

最佳答案

这是由于您在模式中有多个捕获组。您需要在第一种情况下使用 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

关于regex - Scala 模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46621036/

相关文章:

regex - 为什么我无法在正则表达式中将某些字符串与 ( | ) 匹配

scala - 使用 Future[Unit] 时无法解析方法 success.unapply

java - 替换所有出现的 {.? !"><' ,/\|@#$%^&* ~`-_=+} with a word "myWord"

python - 如何在 Python 中创建包含常规变量和一些固定文本的正则表达式?

python - Django 模型中域名的正则表达式匹配

regex - 使用 sed 命令替换一行中的字符串

c# - 为什么这个通过 Regex 组循环打印输出两次?

scala - Kafka 分区键无法正常工作

scala - 是一种更惯用的(并且希望是优雅的)方式来组合可变元素(长度)的 Scala 不可变映射吗?

javascript - 正则表达式和javascript,一些匹配消失了!