如果缺少文本,则添加文本(Perl REGEXP)
使用Perl replace语句(s/),我想修改一些XML,如果缺少,可以向某些项添加一个属性。下面是一个例子:如果缺少文本,则添加文本(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="
...
<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数据结构
- 老前辈
- 用于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
最好的评价你错过了链接的机会。你错过了链接的机会。