2008-10-16 8 views
4

문자열에서 시간 (10.00)을 날짜와 시간 ("21.01.08 10.00")으로 일치시키고 싶습니다. 다음 정규 표현식을 사용하고 있습니다.정규식과 시간 문자열 일치하기

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g"); 

그러나이 값은 21.01.08 및 10.00에서 21.01과 일치합니다.

저는 PCRE를 내 regualar 표현 엔진으로 사용하고 있습니다.

업데이트 :

죄송합니다. 더 분명해야합니다. 데이터와 시간은 더 큰 문자열의 일부입니다. 그 문자열에서 시간을 추출하고 싶습니다. 예를 들어

:

"당사자가 도서관에서 개최됩니다 10.00에서 21.01.08에"

- 21.08.08에 ""21.08.08 파티가있을 것입니다 10시 "를 A. 예정 ... 10.00 "

이것이 가능합니까? 사용

답변

4

\b (단어 경계)이 "."와 일치하므로 원래 정규식이 작동하지 않았습니다. "21.01.08." 날짜를 제외하면서,

(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d]) 

이 시간을 캡처, 당신이 사용하는 표기법 중 하나에 : 당신은 더 견고하게 경계를 코딩 할 필요가있다. 시간의 유효성을 확인하지는 않습니다. 예를 들어, "88:99"와 일치합니다. 시간 검증은 가능하지만 패턴을 상당히 복잡하게 만들고 대부분의 상황에서 과도하게 사용됩니다.

비 캡처 그룹 대신에 룩백을 사용하는 것이 좋지만 PCRE는 가변 너비 룩백을 지원하지 않습니다.

0

시도는

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g"); 

$는 시간 부분이 캡처 그룹에 넣어되면서 트릭을해야 문자열

1
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$ 

의 끝을 나타냅니다.

"새로운 RegExp"에 대해 잘 모르겠다 (Java?). 펄에서 당신은 당신이 다음 덜 모호한 무언가를 사용하려면 다음과 같은 일을해야 .NET에서

if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) { 
    $time_part = $1; 
} 

...

이 가
Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$"); 
    string dateTimeString = "21.01.08 10.00"; 
    if (r.IsMatch(dateTimeString)) { 
    string timePart = r.Match(dateTimeString).Groups[1].Value; 
    Console.Write(timePart); 
    } 
    Console.ReadKey(); 

당신은 또한 Named Capture을 사용할 수 있습니다 ... 같은 값을 얻을 수 캡춰 그룹에의 인덱스

+0

'\ d \ d'는'\ d {2}'처럼 읽기 쉽다고 생각할 수는 없습니다. 그것은 타자를 치기에 훨씬 경제적입니다. 3을 초과하면 (2 이상) 또는 {3,7}의 범위가 필요한 경우 반복이 좋습니다. –

+0

어쩌면 나는 습관에서 벗어나는 경향이 있으며 확고한 숫자 값이 \ d 이스케이프 시퀀스의 수를 세는 것보다 뚜렷하다는 것을 알 수 있습니다. 내가 개인적으로 선호하는 것. – theraccoonbear