使用正则表达式处理多个行匹配

时间:2014-04-16 11:16:12

标签: xml regex perl

我正在将XML文件读入数组.XML文件中包含许多自由格式文本。 是否可以使用正则表达式来捕获数据。

XML文件:

  <class>
    <students>
        <student>
            <roll>1</roll>
            <name>first_name
            middle_name
            last_name</name>
            <remark>
            some free

            form text goes 
            here
            </remark>
        </student>
    </students>
</class>

我正在尝试将值转换为数组:

arr[0]  <class>
arr[1]  <students>
arr[2]  <student>
arr[3]  <roll>1</roll>
arr[4]  <name>first_name middle_name last_name</name>
arr[5]  <remark>some free form text goes here </remark>
arr[6]  </student>
arr[7]  </students>
arr[8]  </class>

我不太确定如何使用正则表达式处理多行文本。正则表达式正确吗?

3 个答案:

答案 0 :(得分:1)

你可能想要使用一个XML解析器,它将带你到达你想去的地方:

$ perl -E 'use XML::Simple; 
    use Data::Dumper; 
    my $ref = XMLin("a.xml", NormaliseSpace => 2) ;
    print Dumper $ref;'
$VAR1 = {
          'students' => {
                        'student' => {
                                     'remark' => 'some free form text goes here',
                                     'name' => 'first_name middle_name last_name',
                                     'roll' => '1'
                                   }
                      }
        };

答案 1 :(得分:1)

不要使用正则表达式来解析XML。使用实际的XML Parser。

一些好的重量级是:XML::LibXMLXML::Twig

对于轻量级模块,擅长阅读不擅长写作:XML::Simple

答案 2 :(得分:0)

清理任何空格和换行符以及您的好处。

您似乎正在使用perl,所以:

@result = $subject =~ m!((?:<.*?>)?(?:</?.*?>|\s+<remark>.*?)?(?:[\w|\s]+)?(?:\s*)?(?:</?.*?>)$)!simg;

<强> REGEX:

/((?:<.*?>)?(?:</?.*?>|\s+<remark>.*?)?(?:[\w|\s]+)?(?:\s*)?(?:</?.*?>)$)/simg

http://regex101.com/r/xZ3vL9