正则表达式标记匹配

时间:2014-11-20 15:46:54

标签: regex perl

我有一个非常简单的Perl函数,它返回我需要解析的自定义XML代码中的标记内容。但是,如果标签内部有行返回,则它返回一个空值,我不确定如何修复它:

sub in_tag
{
    my ($text, $tag) = @_;
    my ($content) = $text =~ m/<$tag.*>(.*)<\/$tag>/;
    $content = $content . "";
    return $content;
}

# works
print in_tag("<item><creation type=\"date\">2014-01-03</creation><name type=\"word\">John Doe</name><id type=\"number\">67</id></item>", "name");

# doesnt work
print in_tag("<item><creation type=\"date\">2014-01-03</creation><name type=\"word\">John\nDoe</name><id type=\"number\">67</id></item>", "name");

1 个答案:

答案 0 :(得分:2)

要使.正则表达式元字符与换行符匹配,您需要使用/s标记:

m/..../s;

您还希望在正则表达式中使用非贪婪量词。在?之后设置*仍然匹配零或更多,但条件是它不会超出与模式的下一部分匹配的文本:

m/<$tag.*?>(.*?)<\/$tag>/

对于快速程序或小而简单的输入,我不介意这种简单的提取,但除此之外,我喜欢XML::Twig。需要一点时间来习惯,但是一旦掌握了它,你就可以毫不费力地做各种奇特的事情。