【问题标题】:Perl String remove a part of it after a patternPerl String 在模式之后删除它的一部分
【发布时间】:2011-04-14 04:21:33
【问题描述】:

我的$html 有一个变量,它包含一个字符串值。我想在单词后面剪掉它

</SELECT>

如何用 Perl 做到这一点?

【问题讨论】:

    标签: regex perl


    【解决方案1】:
    use warnings;
    use strict;
    
    my $html = '<SELECT>foo</SELECT> bar';
    $html =~ s{(</SELECT>).*}{$1};
    print "$html\n";
    
    __END__
    
    <SELECT>foo</SELECT>
    

    您还应该考虑在 CPAN 上使用众多 HTML 解析器之一。

    【讨论】:

      【解决方案2】:
      $html =~ s#</SELECT>.*$#</SELECT>#;
      

      您可以在没有&lt;/SELECT&gt; 的替换字符串中编写它,但恕我直言,它的可读性会降低。

      请注意,s/// 替换可以使用除/ 之外的其他字符作为分隔符,在这种情况下,我选择使用#,因为您的正则表达式包含正斜杠字符,否则必须对其进行转义正则表达式不太可读

      【讨论】:

      • 如果$html字符串包含多行,那么上面的正则表达式只会匹配&lt;/SELECT&gt;,如果它在第一行。您需要添加 's' 修饰符以将字符串视为单行。 s#&lt;/SELECT&gt;.*$#&lt;/SELECT&gt;#s;
      • @Sam - 我不确定 OP 是否意味着行独立......如果行独立。你确实是对的。
      【解决方案3】:

      当刀(寻找固定的绳子)就足够时,不要使用正则表达式(电锯):

      my $html = 'use dom to work with </SELECT> html!';
      my $cut  = '</SELECT>';
      printf "|%s|\n", substr( $html, index( $html, $cut ) + length( $cut ) );
      ==>
      | html!|
      

      【讨论】:

        【解决方案4】:

        如果您想获取位于第一个 &lt;/SELECT&gt; 之前的文本,您可以使用这样的正则表达式:

        $html =~ /(.*?<\/SELECT>)/;
        my $required_text = $1;
        

        或一步到位:

        my ($required_text) = $html =~ /(.*?<\/SELECT>)/;
        

        它使用非贪婪修饰符?,我认为这是你需要的。
        或者更好的是 substr() 子例程,就像前面的答案所说的那样。

        【讨论】:

          猜你喜欢
          • 2013-08-04
          • 1970-01-01
          • 2019-03-15
          • 1970-01-01
          • 1970-01-01
          • 2012-07-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多