2017-10-07 1 views
3
내가 regexlib.com에서이 패턴 일치를 사용하고

-이 그러나 잘 =>는 스칼라 패턴 일치

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