Как я могу написать длинное регулярное выражение, чтобы оно помещалось на экране? - PullRequest
0 голосов
/ 22 июня 2009

У меня есть совпадение с регулярным выражением в Perl. Соответствующее предложение, которое занимает более одной строки.

Я понимаю, что должен вводить регулярное выражение матча только в одну строку, если я распространяю на несколько строк не получается:

$array_11 =~ m{By Steve (.*), MarketWatch LONDON (.*) -- Shares of Anglo American rallied on Monday morning as (.*) bet that the mining group will reject a (.*)};'

Если я напишу его в несколько строк, он не сможет соответствовать этой строке.

Ответы [ 3 ]

12 голосов
/ 22 июня 2009

Как упоминалось ранее, похоже, что вы ищете модификатор x. Этот модификатор игнорирует все пробелы в регулярном выражении и разрешает комментарии (начиная с #).

В вашем случае это немного некрасиво, потому что тогда вам нужно заменить все пробелы, которые вы хотите сопоставить в регулярном выражении [], \ s или \ s +:

$array_11 =~ m{By \s+ Steve \s+ (.*), \s+
               MarketWatch \s+ LONDON \s+ (.*) \s+
               -- \s+ Shares \s+ of \s+ Anglo \s+ American \s+ 
               rallied \s+ on \s+ Monday \s+ morning \s+ as \s+ 
               (.*) \s+ bet \s+ that \s+ the \s+ mining \s+ 
               group \s+ will \w+ reject \w+ a \w+(.*)
              }x;

Так что на самом деле я, вероятно, написал бы что-то вроде этого:

my $sentence= q{By Steve (.*), MarketWatch LONDON (.*) }
            . q{-- Shares of Anglo American rallied on Monday morning as (.*) }
            . q{bet that the mining group will reject a (.*)}
            ;
my $array_11=~ m{$sentence};

Последний комментарий: $array_11 имеет сильный запах кода, если это массив, то сделайте его массивом, а не несколькими скалярными переменными.

9 голосов
/ 22 июня 2009

Возможно, вы ищете модификатор /x.

С perldoc perlre :

x Увеличьте разборчивость вашего шаблона, разрешив пробелы и комментарии.

1 голос
/ 22 июня 2009

Все сбежавшие пространства действительно безобразны и отвлекают. Итак, вот альтернатива:

my ($pattern) = map { qr/$_/ } join q{ }, split q{ }, <<'EOP';
    Steve (.*), MarketWatch LONDON (.*) --
    Shares of Anglo American rallied on Monday morning
    as (.*) bet that the mining group will \w+ reject
    \w+ a \w+(.*)
EOP

$text =~ $pattern;

NB: я оставил (.*), потому что я не знал, что хочет ОП, но см. Комментарий Аксемана по ответу Мирода .

...