2017-10-07 11 views
3

は、私がregexlib.comからこのパターンマッチを使用しています - これは=>Scalaのパターン・マッチング

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 

正常に動作しているようだ

^(?=\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})?$ 

しかし、私は次のように直接それを一致させることはできませんよこの -

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

「いいえ」と表示されます。私は "はい"と思っています

+1

が、私の目は永久にこれによりダメージを受けてしまったを参照してください。どのように私はそれを見分けることができますか? これは人にしないでください。 'DateFormat'を使用してください。 – Dima

+0

同意してください。私は生産でこれを使用していません。 – abipc

答えて

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

関連する問題