Как я могу написать длинное регулярное выражение, чтобы оно помещалось на экране?

У меня есть совпадение регулярных выражений в 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 ответа

Как упоминалось ранее, похоже, что вы ищете модификатор 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 имеет сильный запах кода, если это массив, то сделайте его массивом, а не несколькими скалярными переменными.

Вы можете искать /x модификатор.

От perldoc perlre:

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

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

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: я покинул (.*) потому что я не знал, чего хочет ОП, но посмотри комментарий Аксемана на ответ Мирод.

Другие вопросы по тегам