Perl에서 날짜를 일치시키는 방법 --- UNIX 정규 표현식이 Perl의 정규 표현식과 동일하다고 가정

Perl에서 날짜를 일치시키는 방법 --- UNIX 정규 표현식이 Perl의 정규 표현식과 동일하다고 가정

테이블의 날짜를 일치시키고 싶습니다.

Monday May 26

내 시도는 다음과 같습니다.

/(.*day Jan.*|Feb.*|Mar.*|Apr.*|May|Jun.*|Jul.*|Aug.*|Sep.*|Oct.*|Nov.*|Dec.* [1-31])/

정규식 형식은 UNIX와 Perl에서 동일한 것 같아서 여기에 질문합니다.

답변1

펄 정규식그리고Perl 호환 정규식유사한 유틸리티로 구현된 POSIX "기본" 또는 "확장" 정규식과 약간 다릅니다 grep.위키피디아아마도 차이점을 배우기에 가장 좋은 곳일 것입니다. PCRE 지원은 GNU와 같은 Perl 외부에서 사용 가능합니다 grep -P.

기본 정규식의 경우:

echo "Monday Feb 23" | grep '^[[:alpha:]]+day (Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec)[[:alpha:]]* [1-9][0-9]?$'

명명된 캡처링 그룹이 있는 Perl 정규식의 경우:

$re = qr/
  ^                      # Start of string
  (?<day>[[:alpha:]]+day)  # Match one or more alpha characters before "day". 
  \s+                    # One or more whitespace chars
  (?<month>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[[:alpha:]]*) # Months
  \s+                    # One or more whitespace chars
  (?<number>\d{1,2})     # 1-2 digits.   
  $                  # End of string. 
/x;

print "match\n" if ( "Thursday May 1" =~ $re );
print "match\n" if ( "Monday February 23" =~ $re );
print "no match\n" if ( "Wednesday May 123" !~ $re );
print "no match\n" if ( "Thursday Blarg 23" !~ $re );
print "no match\n" if ( "Inglebert January 5" !~ $re );

x구분 기호 뒤의 수정자를 사용하면 //공백과 주석을 사용하여 정규 표현식을 더 읽기 쉽게 만들 수 있습니다.

성공적인 일치는 일치 해시를 통해 액세스할 수 있는 자체 캡처 그룹에 각 필드를 저장합니다.$+

printf "day [%s] month [%s] day of month [%s]\n", $+{day}, $+{month}, $+{number}

정확한 숫자 일치를 원할 경우 숫자 일치를 통해 좀 더 기술적으로 접근할 수 있습니다.

(?<number>[1-9]|[12][0-9]|3[01])

이 수준에 도달하면 날짜가 너무 복잡하기 때문에 정규식 대신 날짜 구문 분석 모듈을 사용하는 것을 고려해야 합니다. 예를 들어 일반적으로 4월 31일 또는 2월입니다.

답변2

귀하의 입력은 Perl의 다음 패턴과 일치합니다. 다음은 Perl 코드의 한 줄입니다:

perl -e 'if("Monday February 23" =~ /(^.*day (Jan.*|Feb.*|Mar.*|Apr.*|May|Jun.*|Jul.*|Aug.*|Sep.*|Oct.*|Nov.*|Dec.*) [1-31]+)/) {print $1}'

관련 정보