如果缺少文本,则添加文本(Perl REGEXP)

如果缺少文本,则添加文本(Perl REGEXP),regex,perl,sed,Regex,Perl,Sed,使用Perl replace语句(s/),我想修改一些XML,如果缺少,可以向某些项添加一个属性。下面是一个例子: ... <car color="red" owner="john">...</car> <car color="green" age="3">...</car> ... 。。。 ... ... ... 比如说,我想给无主汽车添加一个默认车主。我尝试了以下方法,但没有成功: s/(<car[^>]*)(?!owner="

使用Perl replace语句(s/),我想修改一些XML,如果缺少,可以向某些项添加一个属性。下面是一个例子:

...
<car color="red" owner="john">...</car>
<car color="green" age="3">...</car>
...
。。。
...
...
...
比如说,我想给无主汽车添加一个默认车主。我尝试了以下方法,但没有成功:

s/(<car[^>]*)(?!owner="[^"]*")(.*>)|$1 owner="steve"$2/iUg
s/(]*)(?!owner=“[^”]*”(.*>)|$1 owner=“steve”$2/iUg

非常感谢您的帮助。

尽管您可以使用正则表达式,但始终建议使用XML解析器

Perl/CPAN产品包括:

  • 将XML文档视为Perl数据结构

  • 老前辈

  • 用于SAX解析需求

  • 用于在块中高效地处理XML文档

  • 我个人的最爱


虽然您可以使用正则表达式,但始终建议使用XML解析器

Perl/CPAN产品包括:

  • 将XML文档视为Perl数据结构

  • 老前辈

  • 用于SAX解析需求

  • 用于在块中高效地处理XML文档

  • 我个人的最爱

    • 你可以试试这个

      #!/usr/bin/perl -w
      
      $str = <<EOF;
      <car color="red" owner="john">.*#?§<car color="pink"> </car>.*#?§</car>
      <car color="green" age="3">.*#?§</car>
      <car owner="bill"></car>
      EOF
      
      $str =~ s/(<car(?![^>]+?owner))([^>]*?)>/$1$2 owner="steve">/g;
      
      print $str;
      
      !/usr/bin/perl-w
      $str=/$1$2所有者=“史蒂夫”>/g;
      打印$str;
      
      致意


      注:很可能是打字错误,但无论如何,正则表达式中的竖条必须用斜杠替换。你可以试试这个

      #!/usr/bin/perl -w
      
      $str = <<EOF;
      <car color="red" owner="john">.*#?§<car color="pink"> </car>.*#?§</car>
      <car color="green" age="3">.*#?§</car>
      <car owner="bill"></car>
      EOF
      
      $str =~ s/(<car(?![^>]+?owner))([^>]*?)>/$1$2 owner="steve">/g;
      
      print $str;
      
      !/usr/bin/perl-w
      $str=/$1$2所有者=“史蒂夫”>/g;
      打印$str;
      
      致意


      PS:很可能是输入错误,但无论如何,正则表达式中的竖条必须替换为斜杠,斜杠通常用于XML操作。您的问题可以通过它轻松解决:

      for //car[not(@owner)] set @owner "steve" ;
      
      我通常用于XML操作。您的问题可以在其中轻松解决:

      for //car[not(@owner)] set @owner "steve" ;
      

      避免使用正则表达式解析/更改XML或HTML文档的可能重复项。这是一般性建议。避免使用正则表达式解析/更改XML或HTML文档的可能重复项。这是一般性建议。不需要空while循环。
      /g
      已确保它在
      $str的所有元素上运行。循环只让它运行两次,第二次循环与任何内容都不匹配,因此它返回0(匹配数)。这很容易成为一个无限循环,例如:
      s{foo}{foo}g
      @Schwern谢谢你的评论。我记得:
      m//g!=s///g
      最好的评价是不需要空的while循环。
      /g
      已经确保它运行在
      $str
      的所有元素上。循环只运行两次,第二次不匹配任何东西,因此返回0(匹配数)。这很容易成为一个无限循环,例如:
      s{foo}{foo}g
      @Schwern谢谢你的评论。我记得:
      m//g!=s///g
      最好的评价你错过了链接的机会。你错过了链接的机会。