2016-09-26 2 views
2

나는 자바 프로그램을 작성 해왔다. 프로그램에서 나는 시간이 사용자로부터 입력을 복용하고 있습니다. 입력을 문자열로 취해 패턴과 일치하는지 확인합니다. 내가 원하는 패턴은 다음과 같습니다. 10:15 AM시간 일치를 만드는 방법 Regex 패턴

이것은 내가 시도했지만 작동하지 않는 것입니다.

public static boolean checkTimePattern(String time) { 
    Pattern pattern = Pattern.compile("\\d{1}:\\d{1}^[A]{1}[M]{1}"); 
    if(pattern.matcher(time).matches()){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

감사합니다.

+3

정규식이 아닌 SimpleDateFormat을 사용해야합니다 – Jens

+0

정규식으로 무엇을 확인 하시겠습니까? '\ d {1}'은 1 자리수를,'^ [A] {1}'은'^', 하나는'A'를 의미합니다. 이 모든 것은 의미가 없으며 사용자가 선호하는 형식 인 –

답변

5

단순히 거기 중지 rubular.com에서 화면 하단의 가이드 라인을 확인 의미합니다 (문자열의 시작을 의미하는 중간에,^넣어 말아. Java에는 이미 날짜/시간 값이 포함 된 문자열을 구문 분석하는 메커니즘이 있습니다.

정규 표현식을 공부하는 것이 좋지만 이 아니라이 프레임 워크에 이미 존재하는 것으로 그들을 사용합니다. 해결책은 항상SimpleDateFormat이 (가) 당신을 위해 무엇을하고있는 것보다 과실있을 수 있습니다!

1
  1. ^을 사용하고 있습니까? 저것의 아무 사용도 없다. 지수는 문자열의 시작 부분에 어설 션 위치를 사용하지만이 값을 사용하여 시간과 일치하지는 않습니다.

  2. 자릿수는 1 또는 2 자입니다. \d{1}은 하나의 숫자 만이 있음을 나타냅니다. 대신 하나 또는 최대 두 자리를 나타내는 \d{1,2}을 사용해야합니다.

  3. [A]을로 따를 필요가 없습니다. 그것은 그 자체가 하나의 문자이고 그것이 A이라는 것을 의미합니다. 당신은뿐만 아니라 PM에 대한 지원을 추가 할 경우에 당신은 [AP] 단순히 [M]하거나 M 다음에 사용할 수 있습니다.

당신은 형식이 될 것

\d{1,2}:\d{1,2}\s[AP][M] 

탈출이 정규식을 사용할 수 있습니다

\\d{1,2}:\\d{1,2}\\s[AP][M] 

DEMO

+0

과 일치하지 않습니다. 1.'^'와 문자를 매치 시키려면 문자열 중간에 있으면 이스케이프없이'^'를 사용하면됩니다. 2. "Regex"의 문맥에서, 숫자는'\\ d'가 아닌'\ d'이어야합니다 (이것은 자바 문자열 리터럴에 의해 이스케이프됩니다.) 3.마지막'M '에'[]'이 필요 없습니다. –

+0

@AdrianShum 알림을 보내 주셔서 감사합니다. 그에 따라 답변을 업데이트했습니다. –

-1

당신은 시도 먼저 정규식을 테스트해야합니다 http://rubular.com/

는 $는 끝이

+0

잘못되었습니다. '^'는 중간에'^'을 의미합니다. –

+0

opps 나는 문자 그대로 @adrian 쉼표를 의미하지 않습니다. –

2

귀하의 정규식은 1 개 시간 자리 1 분 자리를 허용하고, A 전에 나타나는 문자열의 시작을 필요로한다. 그것은 거의 의미가 없습니다.

시간 (또는 날짜)를 확인하는 가장 좋은 방법은, SimpleDateFormat 사용 : 당신이 정규식을 사용하는 바인딩하는 경우,

String s = "10:15 AM"; 
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm a"); 
sdf.setLenient(false); 
try { 
    Date dt2 = sdf.parse(s); 
    System.out.println(dt2); 
} 
catch (Exception exc) { 
    System.out.println(s + " IS NOT VALID TIME"); 
} 

//Regex 
String pat = "[0-1]?[0-2]:[0-5][0-9]\\s*[Aa][Mm]"; 
if (s.matches(pat)){ 
    System.out.println("Regex matches the string!"); 
} 

([0-1]?[0-2] 일치 012 시간을 사용하여, [0-5][0-9]0 ~ 59 분과 일치하고 \\s*은 0 개 이상의 공백과 일치하며 [Aa][Mm]은과 일치합니다., AM, aM 또는 am입니다. 선도적 인 0이 필요한 경우, [0-1] 후에서 ?를 제거합니다.)

Java demo

+0

FYI : 시간과 AM 사이에 * 정확히 * 공백이 하나 있으면' \ s'. –

1

당신이 정규식

1을 사용하는 동안 제대로 이해되지 않은 것들 몇 가지가 있습니다 참조하십시오.) ^는 정규 표현식에 의해 예약 된 문자이므로 사용시 이스케이프 처리해야합니다. 여기에 잘못 사용되었지만 여전히 작업하고 싶다면 백 슬래시()를 사용하여 이스케이프 처리하십시오.

  \\d{1}:\\d{1}\^[A]{1}[M]{1}      <- Watch carefully \^ 

2) @GhostCat advice가 올

따라서 식 ( INCORRECT 여전히 있지만 그러나이 같이 있었어야), 여기에 사용하여 SimpleDateFormat.

3.) 정규 표현식을 계속 사용하려면 패턴과 일치 시키려면이를 살펴야합니다.이 -> 이것은을 말한다>이

가 두 자리 정확하게 말한다 -


 \\d{2}:\\d{2}\\s+(AM|PM) 
지금

\\ (D)가 {2}이 부분에 의해 정규식 부분을 이해 두 자리 뒤의 콜론

\\ d를 {2}은 ->이 더과 일치 말한다 ->이

\\ s는 + 정확히 콜론 뒤의 두 자리 숫자를 말한다. XX : XX 뒤에 공백 문자가 있으면 정규식을보다 강력하게 만들기 위해 건너 뛸 수 있습니다.

(AM | PM) -> 이것은 캡처 그룹이며 AM 또는 (PM)과 일치하는 것으로 표시됩니다.

관련 문제