Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl脚本增量生成xml id?_Xml_Regex_Perl - Fatal编程技术网

perl脚本增量生成xml id?

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>

我有这样的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>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;