【问题标题】:Perl: Global substition within tag delimited stringPerl:标记分隔字符串中的全局替换
【发布时间】:2010-08-01 12:11:43
【问题描述】:

我之前的帖子部分去掉了标签,所以又来了:

我的目标是将尾随 - 的所有实例替换为标签括号内的尾随 +。让我们假设要替换的行如下所示:

<h> aa- aa- </h> <h> ba- ba- </h> 

然后应该看起来像

<h> aa+ aa+ </h> <h> ba+ ba+ </h>.

首先我尝试了这个表达式:

s/<h>(.*?)-(.*?)<\/h>/<h>$1+$2<\/h>/g;

产生了这个输出:

<h> aa+ aa- </h> <h> ba+ ba- </h>.

g 选项确实会导致每行多次替换,但仅适用于每个标签括号的第一个实例(并且仅当两个圆括号都包含问号时)。

为了缩小问题的范围,我尝试实现忽略标签的替换。表达式

s/(.*?)-(.*?)/$1+$2/g;

确实会导致预期的结果

<h> aa+ aa+ </h> <h> ba+ ba+ </h>.

当然,这也将替换标记括号之外的内容。

那么我的第一个表达式有什么问题,我怎样才能实现在标签括号内完全替换的目标?

【问题讨论】:

  • 如果您实际上没有新问题,请不要发布新问题,请编辑您的原始问题。您应该删除这个新问题。

标签: xml perl replace tags substitution


【解决方案1】:

1) g 选项适用于包含标签的整个正则表达式

2) 使用两次或直到没有变化

【讨论】:

    【解决方案2】:

    将标签选择和替换操作分开:

    $str = '<h> aa- aa- </h> <h> ba- ba- </h>';
    while ( $str =~ m!<h>.*?-.*?</h>! ) {
        substr( $str, $-[0], $+[0] - $-[0] ) =~ y/-/+/;
    }
    print $str, "\n";
    

    @-@+ 数组提供有关最后一次成功匹配的偏移信息。)

    或者:

    sub fixup_h_tag {
        my $tag = shift;
        $tag =~ y/-/+/;
        $tag
    }
    $str = '<h> aa- aa- </h> <h> ba- ba- </h>';
    $str =~ s{ (<h>.*?</h>) }{ fixup_h_tag("$1") }gxe;
    print $str, "\n";
    

    请注意,如果您的标签标记语言允许 cmets 或某种类型的引用字符串(可能包含或不作为标签)或 h 标签中的可选空格或属性,则正则表达式不容易提供强大的解决方案。

    【讨论】:

      猜你喜欢
      • 2010-10-14
      • 2019-05-08
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多