perl脚本增量生成xml id?
我有这样的xml文件perl脚本增量生成xml id?,xml,regex,perl,Xml,Regex,Perl,我有这样的xml文件 <ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**> **<ce:para>vvv</ce:para>** <ce:para id="p0015">vvv</ce:para> <ce:para id="p0020">vv</ce:para> **<ce:para>
<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**>
**<ce:para>vvv</ce:para>**
<ce:para id="p0015">vvv</ce:para>
<ce:para id="p0020">vv</ce:para>
**<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>**
<ce:para id="p0070">vvddd</ce:para>
xxx**xxx
**vvv**
vvv
vv
**VVxxxxxxx**
vvddd
现在我想为那些我在这里没有加粗的标记生成id=“pxxx”,但条件是id不相同,id只递增5。快速脏Perl解决方案
use strict;
use warnings;
$/ = undef;
my $str = <DATA>;
my $i = 0;
$str =~ s/(<ce:para) (?=\s|>) (.*?)>/"$1 id=\"p" . sprintf("%04d",$i+=5) . "\">"/xsge;
print $str;
__DATA__
<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**>
**<ce:para>vvv</ce:para>**
<ce:para id="p0015">vvv</ce:para>
<ce:para id="p0020">vv</ce:para>
**<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>**
<ce:para id="p0070">vvddd</ce:para>
使用严格;
使用警告;
$/=未定义;
我的$str=;
我的$i=0;
$str=~s/()(.*?>/“$1id=\“p”。sprintf(“%04d”,$i+=5)。“\”>“/xsge;
打印$str;
__资料__
xxx**xxx
**vvv**
vvv
vv
**VVxxxxxxx**
vvddd
输出>>
<ce:para id="p0005">xxx</ce:para>**<ce:para id="p0010">xxx</ce:para**>
**<ce:para id="p0015">vvv</ce:para>**
<ce:para id="p0020">vvv</ce:para>
<ce:para id="p0025">vv</ce:para>
**<ce:para id="p0030">vvvv</ce:para><ce:para id="p0035">xxxxxxx</ce:para>**
<ce:para id="p0040">vvddd</ce:para>
xxx**xxx
**vvv**
vvv
vv
**VVxxxxxxx**
vvddd
编辑-仅更改没有id的、、、和、
use strict;
use warnings;
$/ = undef;
my $str = <DATA>;
my $i = 0;
$str =~
s/
( <ce:para ) # (1)
(?= \s | > )
\s*
(?:
id=
"p
( \d{1,} ) # (2)
"
| .*?
)
>
/
defined $2 and $i=$2-5;
"$1 id=\"p" . sprintf("%04d",$i+=5) . "\">"
/xsge;
print $str;
__DATA__
<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**>
**<ce:para>vvv</ce:para>**
<ce:para id="p0015">vvv</ce:para>
<ce:para id="p0020">vv</ce:para>
**<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>**
<ce:para id="p0070">vvddd</ce:para>
使用严格;
使用警告;
$/=未定义;
我的$str=;
我的$i=0;
$str=~
/
( )
\s*
(?:
身份证=
“p
(\d{1,})#(2)
"
| .*?
)
>
/
定义为$2和$i=$2-5;
“$1 id=\”p“。sprintf(“%04d”,$i+=5)。"\">"
/xsge;
打印$str;
__资料__
xxx**xxx
**vvv**
vvv
vv
**VVxxxxxxx**
vvddd
输出>>
<ce:para id="p0010">xxx</ce:para>**<ce:para id="p0015">xxx</ce:para**>
**<ce:para id="p0020">vvv</ce:para>**
<ce:para id="p0015">vvv</ce:para>
<ce:para id="p0020">vv</ce:para>
**<ce:para id="p0025">vvvv</ce:para><ce:para id="p0030">xxxxxxx</ce:para>**
<ce:para id="p0070">vvddd</ce:para>
xxx**xxx
**vvv**
vvv
vv
**VVxxxxxxx**
vvddd
严格使用;
使用警告;
$/=未定义;
我的$str='';
我的$i=0;
第一:
$i=$i+5;
如果($str=~//){
my$id=sprintf(“%04d”,$i);
如果($str=~//){
后藤第一;
}
否则{
$str=~s/(/“$1id=\'p.sprintf(“%04d”,$i)。“\”>”/xse;
}}
如果($str=~//){
后藤第一;
}
打印$str;
在这里,我首先生成id并用数据检查此id是否已退出。如果退出id,则跳过所有ce:para的替换和增量id。您不能将粗体添加到标记为代码的内容中,但我们得到了图片。我没有得到的是您想要做的。匹配所有内容后,您是否需要重新分配/重命名id值?”行政长官:第"标记?可能还必须重做所有现有的id。有可能吗?首先生成id并检查退出是否再次递增而不替换…这样,我们在替换之前检查退出与否。@simbabque@sI要做而不更改退出id,只需更改那些没有的标记id@KathirK-更新了答案,但这样做的可能性重叠存在(如您所见)。抱歉..可能吗?首先生成id并检查退出是否再次递增而不替换…这样我们在替换之前检查是否退出。@sln现在我可以为所有不包含属性示例的标记生成id,如何为包含此标记的属性示例的标记生成id我要生成id
use strict;
use warnings;
$/ = undef;
my $str = '<ce:para><ce:para><ce:para><ce:para><ce:para id="p0010">';
my $i = 0;
first:
$i=$i+5;
if($str =~ /<ce:para>/) {
my $id=sprintf("%04d",$i);
if($str =~ /<ce:para id="p$id">/){
goto first;
}
else{
$str =~ s/(<ce:para)>/"$1 id=\"p" . sprintf("%04d",$i) . "\">"/xse;
}}
if($str =~ /<ce:para>/){
goto first;
}
print $str;