将 Perl 与 Regex 结合使用,如何删除字符串中的字符串?

Eri*_*res 2 regex xml perl

所以我有几个 XML 文件,其中包含具有唯一 ID 的人,并且每个人都有自己喜欢的食物(一个人可以在多个 xml 文件中):

在某些情况下,id=300 的人可能会在标签的开头吃到食物。

<person id="299">
    <food>
       <type> Hot Dog </type>
    </food>
</person>
<person id="300">
    <food>
       <type> Burger</type>
    </food>
</person>
Run Code Online (Sandbox Code Playgroud)

或者在食物标签之前可能还有其他标签

<person id="300">
    <year>
       <birth> 1990 </birth>
       <marriage> 2020 </marriage>
    </year>
    <food>
       <type> Vegan </type>
    </food>
</person>
Run Code Online (Sandbox Code Playgroud)

我需要使用单个 Perl RegEx 函数来删除 ID 为 300 的人的食物标签,如果它在人标签的开头、中间或结尾,则独立

我知道如果是整个人标签,我可以使用类似的东西:

$fileContents =~ s/<person id=\"300\"[^<]+<\/person>//g;
Run Code Online (Sandbox Code Playgroud)

但是我必须完整地保留人员标签,我只能移除人员标签内的食物标签,但我无法移除所有食物标签,因为我需要将其留给其他 ID 的人。

请问你能帮帮我吗??我一直在为这个 D 苦苦挣扎:

ike*_*ami 5

你不能用替换来安全地做到这一点。

即使是半途而废的方法也比使用现有的 XML 解析器更复杂。

$_->unbindNode()
   for $doc->findnodes('//person[@id="300"]/food');
Run Code Online (Sandbox Code Playgroud)

完整解决方案:

use XML::LibXML qw( );

# my $doc = XML::LibXML->new->parse_file(...);
#    or
# my $doc = XML::LibXML->new->parse_string(...);

$_->unbindNode()
   for $doc->findnodes('//person[@id="300"]/food');

# $doc->toFile(...)
#    or
# $doc->toString(...)
Run Code Online (Sandbox Code Playgroud)