Извлечение строки между двумя строками с помощью Regexp в Perl - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь извлечь текст между [%L10n.msg(' и ')%] в Perl, поэтому, например, если у меня есть код вроде [%L10n.msg('foo')%], я бы хотел получить foo .

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

Я хотел бы знать, что не так с этим скриптом и как его исправить.

Мой скрипт Regexp:

my (@L10n) = $content_from_file =~ /\[\%L10n\.msg\('(.*)'\)\%\]/g;

$ content_from_file:

    <div class="detail-trash">
          <span class="blog-article-social-net social-net-fb">
             <svg class="svg-icon-facebook">
                <use xlink:href="[%domain.url_media%]/images/svg-sprite.svg#svg-icon-facebook"></use>
             </svg>
             [%L10n.msg('Zdielať')%]
          </span>
       <span class="previews-counter">Počet hodnotení: [%product.rating_votes%]</span>
       <a href="#" title="[%L10n.msg('Zobraziť recenzie')%]" class="previews-btn js-previews-btn">[%L10n.msg('Zobraziť recenzie')%]</a>
    </div>

Текущий результат:

Zdiela\x{165}
Zobrazi\x{165} recenzie')%]\" class=\"previews-btn js-previews-btn\">[%L10n.msg('Zobrazi\x{165} recenzie

Запрошенный результат:

Zdielať
Zobraziť recenzie
Zobraziť recenzie

Ответы [ 3 ]

0 голосов
/ 17 ноября 2018

Я создал это регулярное выражение для вас

(?:\[%L10n.msg\(')([A-Za-zť ]+)

Это соответствует тому, что вам нужно, но, возможно, вам нужно настроить, если для словацких символов?Результат в группе 1

Вы можете посмотреть здесь.

https://regex101.com/r/hHbNEe/1/

0 голосов
/ 17 ноября 2018

Самый простой способ решить проблему соответствия - это сделать .* часть вашего регулярного выражения нежадной, добавив ? в конец.

Вашу проблему с кодированием сложнее решить, поскольку она зависит от кодировки вашего файла данных и того, как вы читаете данные в свой файл. Так что нам нужно больше информации.

У меня работает эта версия:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $content_from_file = <<END_OF_TXT;
    <div class="detail-trash">
          <span class="blog-article-social-net social-net-fb">
             <svg class="svg-icon-facebook">
                <use xlink:href="[%domain.url_media%]/images/svg-sprite.svg#svg-icon-facebook"></use>
             </svg>
             [%L10n.msg('Zdielať')%]
          </span>
       <span class="previews-counter">Počet hodnotení: [%product.rating_votes%]</span>
       <a href="#" title="[%L10n.msg('Zobraziť recenzie')%]" class="previews-btn js-previews-btn">[%L10n.msg('Zobraziť recenzie')%]</a>
    </div>
END_OF_TXT

my (@L10n) = $content_from_file =~ /\[\%L10n\.msg\('(.*?)'\)\%\]/g;
say Dumper @L10n;

Выход:

$VAR1 = 'Zdielať';
$VAR2 = 'Zobraziť recenzie';
$VAR3 = 'Zobraziť recenzie';
0 голосов
/ 17 ноября 2018

В регулярном выражении .* является жадным. Это означает, что он будет пытаться сопоставить самую длинную возможную строку. Измените его на .*?, чтобы оно не было жадным. Тогда это будет соответствовать самой короткой возможной строке.

my @L10n = $content_from_file =~ /\[%L10n\.msg\('(.*?)'\)%\]/g;
...