문제
날짜와 시간 ( "21.01.08 10.00")과 스트링에서 시간 (10.00)을 일치시키고 싶습니다. 다음과 같은 정규 표현을 사용하고 있습니다.
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");
그러나 이것은 21.01.08 및 10.00에서 21.01과 일치합니다.
PCRE를 Regualar Expression Engine으로 사용하고 있습니다.
업데이트:
죄송합니다. 더 명확했을 것입니다. 데이터와 시간은 더 큰 문자열의 일부입니다. 그 끈에서 시간을 추출하고 싶습니다.
예를 들어:
"10.00에서 21.01.08에서 파티는 도서관에서 열립니다" "21.08.08- 10:00 파티가있을 것입니다." 10.00 "에서 시작
이게 가능해?
해결책
당신의 원래 Regex는 작동하지 않았습니다 \b
(단어 경계) "." "21.01.08" 경계를보다 강력하게 코딩해야합니다.
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
이것은 날짜를 제외하면서 사용한 표기법 중 하나에서 시간을 캡처합니다. 시간을 검증하지는 않습니다. 예를 들어, 시간을 검증하는 "88:99"는 가능하지만 패턴을 크게 복잡하게하고 대부분의 상황에서는 과잉 일 수 있습니다.
캡처되지 않은 그룹화 대신 룩 하인드를 사용하는 것이 좋지만 PCRE는 가변 폭 룩-비만을 지원하지 않습니다.
다른 팁
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$
시간 부분이 캡처 그룹에 넣어야하는 트릭을 수행해야합니다.
"새로운 regexp"나는 확실하지 않습니다 (Java 아마도?). Perl에서 당신은 같은 가치를 얻을 수 있습니다 ...
if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
$time_part = $1;
}
.NET에서 다음은 작동해야합니다 ...
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();
당신은 또한 사용할 수 있습니다 캡처 명명 덜 모호한 것을 사용하려면 캡처 그룹에 대한 색인을 사용하려면 인덱스가 있습니다.
사용해보십시오
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g");
$는 문자열의 끝을 나타냅니다