Perl正则表达式匹配可选的空格字符

时间:2014-06-20 20:08:57

标签: regex perl expression newline optional

我试图从XML文件中解析/提取数据并检索必要的数据。

例如:

<about>
    This is an XML file
    that I want to
    extract data from
</about>
<message>Hello, this is a message.</message>
<this>Blah</this>
<that>Blahh</that>
<person> 
    <name>Jack</name>
    <age>27</name>
    <email>jack@gmail.com</email>
</person>

我无法在<about>代码中获取内容。

这是我到目前为止所做的:

(<\w*>)[\s*]?([\s*]?.*)(<\/\w*>)/m

我只是想提取标签名称和内容,这就是我在那里有括号的原因。即($tag = $1) =~ s/[<>]//获取标记名称$tagcontent = $2以获取标记的内容。我使用\s表示空白字符(空格,制表符,换行符)和?,因为它可能会也可能不会发生*次数。

我是通过http://www.regexe.com/对此进行测试的,并且没有运气匹配。

感谢任何帮助。提前谢谢!

2 个答案:

答案 0 :(得分:4)

XML不是常规语言,无法使用正则表达式进行准确解析。请改用XML解析器。这保证适用于所有情况,并且如果标记的格式在将来发生变化,则不会中断。

但是,如果您完全确定格式,那么可以使用以下正则表达式:

/<(\w+)>\s*(.*?)\s*<\/\1>/s

说明:

  • / - 开始分隔符
  • <(\w+)> - 开场标记
  • \s* - 匹配
  • 之间的可选空格
  • (.*?) - 匹配标记内的内容
  • \s* - 匹配
  • 之间的可选空格
  • <\/\1> - 匹配结束标记。 \1这里是一个反向引用,其中包含第一个捕获组匹配的内容。
  • / - 结尾分隔符

请注意,s修饰符和m修饰符完全不同,并执行不同的操作。有关每项操作的详细信息,请参阅this answer

Regex101 Demo

答案 1 :(得分:4)

我建议你不要尝试使用正则表达式来解析XML,而是使用实际的XML Parser。

以下使用XML::LibXML显示“about”节点中的文本。但是,另一个优秀的框架是XML::Twig

use strict;
use warnings;

use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);

my $about = $xml->findvalue('//about');

print $about, "\n";

__DATA__
<root>
<about>
    This is an XML file
    that I want to
    extract data from
</about>
<message>Hello, this is a message.</message>
<this>Blah</this>
<that>Blahh</that>
<person> 
    <name>Jack</name>
    <age>27</age>
    <email>jack@gmail.com</email>
</person>
</root>

输出:

    This is an XML file
    that I want to
    extract data from