我在perl中有一个包含目录规范的字符串。如果该字符串包含组成日期掩码的任何单个或多个子字符串组合,那么我要提取该子字符串。例如,目录规范可能是:
/mydir/data/YYYYMMDD
我希望能够提取“YYYYMMDD”字符串。但是,路径的该部分可以是以下字符串的任何单个或组合:
YY
YYYY
MM
DD
因此,目录规范字符串可以显示为:
/mydir/data/DD/data2
并且我希望正则表达式比较的结果是返回“DD”。当字符串必须包含一个或多个日期掩码字符串并且该字符串必须在两个“/”字符之间或在字符串末尾时,如何捕获该字符串?
最佳答案
我假设YYYY
和YY
都不会出现在同一模式中,因为否则它就没有意义。
use Data::Munge qw(list2re);
use List::MoreUtils qw(uniq);
use Algorithm::Combinatorics qw(variations);
use Perl6::Take qw(gather take);
list2re
uniq
gather {
for my $n ([qw(YYYY MM DD)], [qw(YY MM DD)]) {
for my $k (1..scalar @$n) {
take map { join q(), @$_ } variations($n, $k)
}
}
}
该表达式返回regex
(?^:DDMMYYYY|DDYYYYMM|MMDDYYYY|MMYYYYDD|YYYYDDMM|YYYYMMDD|DDMMYY|DDYYMM|DDYYYY|MMDDYY|MMYYDD|MMYYYY|YYDDMM|YYMMDD|YYYYDD|YYYYMM|DDMM|DDYY|MMDD|MMYY|YYDD|YYMM|YYYY|DD|MM|YY)
。 (半)函数式编程为赢!