【问题标题】:Perl regex match optional whitespace charactersPerl 正则表达式匹配可选的空白字符
【发布时间】:2014-06-20 20:08:56
【问题描述】:

我正在尝试从 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>

我在获取 &lt;about&gt; 标记中的内容时遇到问题。

这是我目前所拥有的:

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

我只是想提取标签名称和内容,这就是为什么我在那里有括号。即($tag = $1) =~ s/[&lt;&gt;]// 获取标签名称,$tagcontent = $2 获取标签内容。我将\s 用于空白字符(空格、制表符、换行符)和?,因为它可能会或可能不会出现* 的次数。

我正在通过http://www.regexe.com/ 对此进行测试,但没有成功匹配。

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

【问题讨论】:

标签: regex perl expression newline optional


【解决方案1】:

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

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

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

解释:

  • / - 起始分隔符
  • &lt;(\w+)&gt; - 开始标签
  • \s* - 匹配中间的可选空格
  • (.*?) - 匹配标签内的内容
  • \s* - 匹配中间的可选空格
  • &lt;\/\1&gt; - 匹配结束标签。 \1 这是一个反向引用,其中包含第一个捕获组匹配的内容。
  • / - 结束分隔符

注意s 修饰符和m 修饰符完全不同,做不同的事情。请参阅 this answer 了解有关每个功能的更多信息。

Regex101 Demo

【讨论】:

  • 是的,我应该使用 XML::Parser,我认为知道如何使用正则表达式可能会很方便。感谢您非常清楚的解释!
  • 很高兴我能帮上忙,@lkisac。由于您是新来的,我会这样说:如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道您的问题已得到解决,并为帮助您的人提供帮助。请参阅this post 了解更多信息。
  • 谢谢。我最初试图投票,但如果没有足够的声誉,我将无法投票。不知道我必须点击接受。感谢您的提示!
  • +1,但是用(\S*) 代替(.*?) 来安抚反点星怪物怎么样?
【解决方案2】:

我建议您不要尝试使用正则表达式来解析 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
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
相关资源
最近更新 更多