我正在寻找一个正则表达式来获取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中的部分。
任何建议请!!
答案 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;