正则表达式获取CAPS中的所有内容

时间:2011-07-18 19:44:53

标签: regex perl split

我正在寻找一个正则表达式来获取CAPS中的单词

例如:我有一个存储文件路径的数组,这些数组可以是任何以下模式

images/p/n/ct/XYZ-WW_V1.jpg

images/p/c/ABC-TY_V2.jpg

所以基本上我只想要“XYZ-WW”和“ABC-TY”。 有什么建议在我的分割代码中使用正则表达式。我使用以下

foreach (@filefound){

my @result = split('_',$_);

push @split1, $result[0];

}

这只是在_分裂,我正在访问[0]值,但现在我想得到CAPS中的部分。

任何建议请!!

5 个答案:

答案 0 :(得分:2)

根本没有理由使用split。只需通过正则表达式获取所需的位。从您的示例来看,您似乎想要所有由大写ASCII字母和破折号组成的内容:

my @bignames;
foreach (@filefound){
    if ( /([A-Z-]+)/ ) {
        push @bignames, $1;
    }
}

答案 1 :(得分:1)

我认为这应该有效:

[A-Z]+-[A-Z]+

答案 2 :(得分:0)

foreach (@filefound) {
   if ($_ ~= /.*([A-Z]+-[A-Z]+)_[A-Z]\d\..{3}$ ) {
      push @split1, $1;
   }

答案 3 :(得分:0)

你可以试试这个:

if ($_ =~ /[\-A-Z]+/)
    push @split1, $&;

将匹配任何大写字母和 - 的组合;或者,如果你想要更严格的控制,这个:

if ($_ =~ /\/([A-Z]{3}-[A-Z]{2})_/)
    push @split1, $1;

只匹配一系列大写字母后跟-和一系列2个大写字母;以/开头,以_结尾(不包括这些内容)。

从这些示例中,您可以构建所需的完全正则表达式。

答案 4 :(得分:0)

请记住,列表上下文中的匹配将返回捕获的字符串。

#!/usr/bin/perl

use warnings; use strict;
use File::Basename qw(basename);

my @files = qw(
    images/p/n/ct/XYZ-WW_V1.jpg
    images/p/c/ABC-TY_V2.jpg
);

my @prefixes = map { (basename $_) =~ /^( [A-Z]+ - [A-Z]+ )/x } @files;

print "$_\n" for @prefixes;