【问题标题】:Perl Matching Part of StringPerl 匹配字符串的一部分
【发布时间】:2019-12-22 05:35:55
【问题描述】:

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

$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 是字母。我想从每个字符串名称中获取“weekxxxX”部分,以便仅使用此字符串创建最终文件名。例如,如果我的文件是$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";
}

【问题讨论】:

  • 79 和 week 是否一直存在?如果是这样,相当容易做到/79week(\d\d)([a-zA-Z])/Demo
  • @dawg 请检查帖子编辑
  • my ($week) = $file1 =~ /-[0-9]{2}(week[0-9]{2}[a-zA-Z])-/;

标签: regex perl


【解决方案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;

我希望能回答您与正则表达式相关的问题。

您的陈述:

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

只会将$week 设置为第1 组,或48。所以另一种选择是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-15
    • 2012-12-30
    • 2019-10-18
    • 2014-07-20
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多