在Perl中使用Regexp提取两个字符串之间的字符串

时间:2018-11-17 10:44:31

标签: regex string perl text extract

我尝试在Perl中提取[%L10n.msg('')%]之间的文本,因此例如,如果我有类似[%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 :(得分:2)

在正则表达式.*中是贪婪的。这意味着它将尝试匹配可能的最长字符串。 将其更改为.*?,以使其不贪婪。然后它将匹配可能的最短字符串。

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

答案 1 :(得分:1)

解决匹配问题的最简单方法是,通过在末尾添加.*,使?成为正则表达式的非贪婪部分。

您的编码问题更难解决,因为它取决于数据文件的编码以及如何将数据读入文件中。因此,我们将需要更多信息。

此版本对我有用:

#!/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';

答案 2 :(得分:0)

我为您创建了此正则表达式

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

它与您需要的内容相匹配,但是如果需要斯洛伐克语字符,可能需要进行调整? 结果在第1组

您可以在这里看看。

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