【问题标题】:Extract string between two strings using Regexp in Perl在 Perl 中使用 Regexp 提取两个字符串之间的字符串
【发布时间】:2019-04-20 09:15:03
【问题描述】:

我尝试在 Perl 中提取 [%L10n.msg('')%] 之间的文本,例如,如果我有类似 [%L10n.msg('foo')%] 的代码,我想获得 foo

我有它的工作脚本,你可以在下面看到它,但它有问题,它会破坏编码,你可以看到。

我想知道那个脚本有什么问题以及如何修复它。

我的正则表达式脚本:

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

【问题讨论】:

    标签: regex string perl text extract


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢你,这行得通,但编码仍然被破坏。
    • @tomsk 编码是一个完全不同的问题。这取决于很多事情,例如您的终端(是否需要 UTF-8 或其他编码)以及初始字符串 $content_from_file 的编码。这是你必须解决的问题。
    【解决方案2】:

    我为你创建了这个正则表达式

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

    它符合您的需求,但也许您需要针对斯洛伐克字符进行调整? 结果在group1中

    你可以在这里看看。

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

    【讨论】:

    • 是的,但它甚至可以在 L10n 中包含 HTML 代码 :)
    【解决方案3】:

    解决匹配问题的最简单方法是通过在末尾添加 ? 来使您的正则表达式中的 .* 不贪婪。

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

    这个版本适合我:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2013-12-11
      相关资源
      最近更新 更多