我正在逐行读取一个xml文件,而我所关心的只是行
看起来像这样:
<DBGen Include="FileIWant.dbd" />
我需要创建一个包含以下内容的新字符串:
"FileIWant"
如何使用正确的正则表达式替换魔法?
my $string = $row =~ /magic/
答案 0 :(得分:1)
呃..
$file_string = /Include="([^\."]*)\.[^\."]*"/
答案 1 :(得分:1)
my $string = $row =~ m/(.*)Include="(.*)\.(.*)".*/;
print $2, "\n"; #where $2 is the second parenthesis
输出:
FileIWant
答案 2 :(得分:1)
不要使用正则表达式来解析XML。这是坏事和坏事。使用XML解析器。 XML::Twig
是我喜欢的一个例子。还有其他人,只是远离XML::Simple
,这是令人讨厌的。
my $twig = XML::Twig -> parsefile ( 'your_file.xml' );
my $filename = $twig -> findnodes('//DBGen',0)->att('Include');
这将在XML中找到名为DBGEn
的第一个节点,并提取Include
属性。
它真的很简单,并且不会被XML格式化绊倒 - 即使你给出的简单例子可以写成几种不同的 - 并且完全有效 - 的方式。
<xml
><DBGen
Include="FileIWant.dbd"
/></xml>
或者:
<xml><DBGen Include="FileIWant.dbd"/></xml>
或者:
<xml><DBGen Include="FileIWant.dbd"></DBGen></xml>
或者:
<xml>
<DBGen
Include="FileIWant.dbd"
/>
</xml>
或者可能有其他属性,这意味着它不是元素标签之后的第一个单词。这样做真的很蠢,而且你不需要 - 解析它非常简单,并且仍然可以在一个衬里中完成 - 例如:上面的代码:
perl -0777 -MXML::Twig -e 'print XML::Twig->parse(<>)->findnodes('//DBGen',0)->att('Include');'