如何在 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正则表达式Perl 兼容的正则表达式与类似实用程序实现的 POSIX“基本”或“扩展”正则表达式略有不同grep维基百科可能是了解差异的最佳地点。 PCRE 支持可以在 Perl 以外的地方使用,例如 GNU 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}'

相关内容