Perl字符串的匹配部分

时间:2019-12-21 20:17:55

标签: regex perl

我想从文件路径中获取日期部分,以便在文件名中使用它们。例如,文件的格式可以为:

$file1 = "/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my.text"  
$file2 = "/mypath/sd-urt7-afd-parent-79week46d-AFD-lk-my.text"  
$file3 = "/mypath/sd-urt7-ert-parent-79week50c-ERT-lk-my.text"  

不管上面的文件名格式如何,都有一部分的格式为“ 79weekxxX”,其中xx是星期数,X是字母。我想从每个这些字符串名称中获取“ weekxxX”部分,以便仅使用此字符串创建最终文件名。例如,如果我的文件是$file1,那么我想将其存储在另一个变量中,例如包含week48a的week,并创建另一个名为$filename="$week.txt"的变量。

我正在考虑使用正则表达式匹配来执行此操作,但我不确定如何执行。请让我知道我的问题的任何部分仍然不清楚,以便我进一步阐述。谢谢。

编辑: “ 79week”始终存在。确切地说,我不会将它们作为具有文件名的变量来访问。路径是其自身对应键的嵌套哈希值。所以这样做是可行的:

 my %hash = ( 
        "rev" => {
            "first" => "$filepath1",  
            "second" => "$filepath2", 
            "third" => "$filepath3"                      
        },  
        "for" => {
            "first" => "$filepath1_2",  
            "second" => "$filepath2_2", 
            "third" => "$filepath3_2" 
        }   
    );

foreach my $inner (keys %{$hash{$outer}}){
my $file = basename($inner); //only takes the file name, and ignores the rest of the path
my ($week) = $file =~ /79week(\d\d)([a-zA-Z])/;
$filename = "$week.txt";
}

2 个答案:

答案 0 :(得分:1)

一般观察:

如果$file包含一个字符串,例如:

/mypath/sd-urt7-dfc-adfj345h-d0-79week48a-DFC-lk-my.text

然后执行:

$file =~ /79(week\d+[a-z])/i;

变量$1(根据上述正则表达式设置为组1匹配项)将包含(在上面的示例中):

week48a

然后您可以分配my $week = $1;

我希望能回答有关Regex的问题。

您的声明:

my ($week) = $file =~ /79week(\d\d)([a-zA-Z])/;

将仅将$week设置为组1或48。因此,另一种选择是:

my ($week) = $file =~ /79(week\d\d[a-zA-Z])/;

答案 1 :(得分:0)

my ( $week ) = $file1 =~ m{ ( week \d\d [A-Za-z] ) }x;

在这里,x标志是为了提高可读性,并导致忽略空白和注释。如果星期数可以是一位或两位数,请使用\d{1,2}

我还建议使用比$fileN更多的描述性变量,或使用@file_names之类的数组。