regex - 使用 perl 加入、拆分和映射以创建新属性

标签 regex perl dictionary

my $str = "<SampleElement oldattribs=\"sa1 sa2 sa3\">";

$str =~ s#<SampleElement[^>]*oldattribs="([^"]*)"#
          my $fulcnt=$&;
          my $afids=$1;
          my @affs = ();
          if($afids =~ m/\s+/) {
              @affs = split /\s/, $afids; 
              my $jnafs = join ",", map { $_=~s/[a-z]*//i, } @affs;
              ($fulcnt." newattribs=\"$jnafs\"");
          }
          else {
              ($fulcnt);
          }
         #eg;

我的输出:

<SampleElement oldattribs="sa1 sa2 sa3" newattribs="1,1,1">

预期输出:

<SampleElement oldattribs="sa1 sa2 sa3" newattribs="1,2,3">

有人可以指出我哪里做错了。提前致谢。

最佳答案

您出问题的时间比您想象的要早 - 您正在使用正则表达式解析 XML。 XML 是上下文相关的,而正则表达式不是,so it's NEVER going to be better than a dirty hack.

#!/usr/bin/env perl
use strict;
use warnings;

use XML::Twig;
my $twig = XML::Twig -> parse ( \*DATA );

my $sample_elt = $twig -> get_xpath('//SampleElement',0); 
my @old_att = split ( ' ', $sample_elt -> att('oldattribs') );
$sample_elt -> set_att('newattribs', join " ", map { /(\d+)/ } @old_att);

$twig -> set_pretty_print ( 'indented_a' );
$twig -> print;


__DATA__
<XML>
    <SampleElement oldattribs="sa1 sa2 sa3">
    </SampleElement>
</XML>

但要回答问题的核心 - 您在这里滥用 map 作为迭代器。

map { $_=~s/[a-z]*//i, } @affs;

因为 that 正在做的是迭代 @affs 中的所有元素并修改它们...但是 map 只是返回结果表达式的 - 这是 1 因为它有效。

如果你改变@affs你会:

s/[a-z]*//i for @affs; 

但如果您不想这样做,那么简单的答案就是使用 r 正则表达式标志:

map { s/[a-z]*//ir } @affs;

或者像我在示例中所做的那样:

map { /(\d+)/ } @affs; 

哪个正则表达式匹配并捕获字符串的数字部分,但结果返回的是“捕获的”文本。

关于regex - 使用 perl 加入、拆分和映射以创建新属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40926870/

相关文章:

Python提取子字符串但保留空格

java - 如何将日期删除为字符串格式?

php - PHP 中的正则表达式转义转义字符

perl - WWW::Mechanize::Firefox xpath 上的先前结果

java - 自定义方程求解器错误

regex - 使用 perl 程序在文件中查找文本

Perl - Mechanize ? - 如何让页面中的所有链接达到特定的 "delimiter"文本

python - 使用键列表从 Python 字典中收集值

python - 如何在对象列表中连接字符串

regex - 如何将 "lastname, firstname"拆分为单独的字符串?