Regex 使用perl需要列表中标签元素的最大值

Regex 使用perl需要列表中标签元素的最大值,regex,perl,Regex,Perl,下面提供的列表的as包含嵌套列表。我需要获取元素中的最大级别值,并在属性显示为“type=“num”的元素之前插入该值 例如: 输入: <list spitype="num" id="list1"> <list-item><label>1</label><para></para></list-item> <list-item><label>2</label>&

下面提供的列表的as包含嵌套列表。我需要获取元素中的最大级别值,并在属性显示为“type=“num”的元素之前插入该值

例如:

输入:

 <list spitype="num" id="list1">
    <list-item><label>1</label><para></para></list-item>
    <list-item><label>2</label><para></para>
       <list spitype="num" id="list1-1">
      <list-item><label>1</label><para></para></list-item>
      <list-item><label>2</label><para></para></list-item>
      <list-item><label>3</label><para></para></list-item>
       </list></list-item>
    <list-item><label>3</label><para></para></list-item>
    <list-item><label>4</label><para></para></list-item>
    <list-item><label>5</label><para></para></list-item>
 </list>

1.
2.
1.
2.
3.
3.
4.
5.
输出:

 **<max-val-5/>**
 <list spitype="num" id="list1">
    <list-item><label>1</label><para></para></list-item>
    <list-item><label>2</label><para></para>
         **<max-val-3/>**
     <list spitype="num" id="list1-1">
      <list-item><label>1</label><para></para></list-item>
      <list-item><label>2</label><para></para></list-item>
      <list-item><label>3</label><para></para></list-item>
       </list></list-item>
    <list-item><label>3</label><para></para></list-item>
    <list-item><label>4</label><para></para></list-item>
    <list-item><label>5</label><para></para></list-item>
 </list>
****
1.
2.
****
1.
2.
3.
3.
4.
5.
我已经写了下面的代码,但是我没有得到输出。嵌套列表在此列表中未涵盖。你能不能请任何能帮上忙的人将不胜感激

$incnt=~s{(<list(?: |>)[^>]*>((?:(?!<\/list>).)*)<\/list>)}{
my $list=$1; my ($sbpre,$sbmatch,$sbpost,$slmatch,$LblWidthVal) = "";
if($list=~m/<list(?: |>)[^>]*type="num"[^>]*>/g)
{
    $sbpre=$sbpre.$`; $sbmatch=$&; $sbpost=$';
    $slmatch=$1 while($list=~m/<label>([^<>]*)<\/label>/sg);
    $slmatch=~s/[.,:;\(\)\[\]\{\}]*//g;
    $LblWidthVal = "<max-val-$slmatch/>";
    $sbmatch = $LblWidthVal."\n".$sbmatch;
    $sbpre = $sbpre.$sbmatch; $list = $sbpost;
}
if(length $sbpre) {  $list = $sbpre.$sbpost;  }
"$list";}igse;
$incnt=~s{()[^>]*>(((?:(?!))*)){
my$list=$1;my($sbpre、$sbmatch、$sbpost、$slmatch、$LblWidthVal)=“”;
如果($list=~m/)[^>]*type=“num”[^>]*>/g)
{
$sbpre=$sbpre.$`;$sbmatch=$&;$sbpost=$;
$slmatch=$1,而($list=~m/([^]*)/sg);
$slmatch=~s/[,:;\(\)\[\]\{\}]*//g;
$LblWidthVal=“”;
$sbmatch=$LblWidthVal.“\n”。$sbmatch;
$sbpre=$sbpre.$sbmatch;$list=$sbpost;
}
如果(长度$sbpre){$list=$sbpre.$sbpost;}
“$list”}igse;

虽然可以添加一个名为
max-val-5
的新XML元素,但在元素名中添加信息是非常不规则的。在一个XML元素中包含两个根元素也是非法的,因此我将您的代码包装在一个
元素中,并添加了一个新的元素`

这个解决方案使用了这个模块,我认为它比其他模块更容易使用,尤其是在输出XML时,它的所有文档都放在一个页面上

我希望您会同意,与正则表达式解决方案相比,它非常简单

use strict;
use warnings 'all';

use XML::Twig;
use List::Util 'max';

my $twig = XML::Twig->new( pretty_print => 'indented' );
$twig->parsefile('test.xml');

my $max_label = max $twig->findvalues('//label');

my $max_element = XML::Twig::Elt->new( max => { value => $max_label } );

$max_element->paste( first_child => $twig->root);

$twig->print;
输出

1.
2.
1.
2.
3.
3.
4.
5.

虽然可以添加一个名为
max-val-5
的新XML元素,但在元素名中添加信息是非常不规则的。在一个XML元素中包含两个根元素也是非法的,因此我将您的代码包装在一个
元素中,并添加了一个新的元素`

这个解决方案使用了这个模块,我认为它比其他模块更容易使用,尤其是在输出XML时,它的所有文档都放在一个页面上

我希望您会同意,与正则表达式解决方案相比,它非常简单

use strict;
use warnings 'all';

use XML::Twig;
use List::Util 'max';

my $twig = XML::Twig->new( pretty_print => 'indented' );
$twig->parsefile('test.xml');

my $max_label = max $twig->findvalues('//label');

my $max_element = XML::Twig::Elt->new( max => { value => $max_label } );

$max_element->paste( first_child => $twig->root);

$twig->print;
输出

1.
2.
1.
2.
3.
3.
4.
5.

?@jm666:我们没有使用任何XML模块,而只是使用正则表达式。可能正在尝试获取输出。@ssr1012:尝试使用正则表达式来实现这一点是一个非常糟糕的主意,我怀疑您是否会让任何人来帮助编写这样的解决方案。为什么不能使用
XML::LibXML
XML::Twig
?我同意@Borodin的观点,这不是一个要求正则表达式的问题。现在咬紧牙关,学习如何使用XML模块。另外?@jm666:我们没有使用任何XML模块,而只是使用正则表达式。可能正在尝试获取输出。@ssr1012:尝试使用正则表达式来实现这一点是一个非常糟糕的主意,我怀疑您是否会让任何人来帮助编写这样的解决方案。为什么不能使用
XML::LibXML
XML::Twig
?我同意@Borodin的观点,这不是一个要求正则表达式的问题。现在咬紧牙关,学习如何使用XML模块