Regex, чтобы получить все в CAPS - PullRequest
0 голосов
/ 18 июля 2011

Я ищу регулярное выражение, чтобы получить только слова в 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 ]

2 голосов
/ 18 июля 2011

Нет причин использовать split вообще.Просто возьмите нужные биты с помощью регулярного выражения.Из вашего примера похоже, что вы хотите все, что состоит из прописных букв ASCII и тире:

my @bignames;
foreach (@filefound){
    if ( /([A-Z-]+)/ ) {
        push @bignames, $1;
    }
}
1 голос
/ 18 июля 2011

Я думаю, что это должно работать:

[A-Z]+-[A-Z]+
0 голосов
/ 19 июля 2011

Имейте в виду, что совпадение в контексте списка вернет захваченные строки.

#!/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;
0 голосов
/ 18 июля 2011

Вы можете попробовать это:

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

, который будет соответствовать любой комбинации заглавных букв и -; или, если вы хотите более строгий контроль, это:

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

, который будет соответствовать только последовательности заглавных букв, за которыми следует - и последовательности из 2 заглавных букв; начиная с / и заканчивая _ (исключаются).

Из этого примера вы можете построить именно то регулярное выражение, которое вам нужно.

0 голосов
/ 18 июля 2011
foreach (@filefound) {
   if ($_ ~= /.*([A-Z]+-[A-Z]+)_[A-Z]\d\..{3}$ ) {
      push @split1, $1;
   }
...