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月です。

おすすめ記事