带有正则表达式

时间:2015-10-13 02:30:55

标签: regex xml perl matching

我正在逐行读取一个xml文件,而我所关心的只是行

看起来像这样:

<DBGen Include="FileIWant.dbd" />

我需要创建一个包含以下内容的新字符串:

"FileIWant"

如何使用正确的正则表达式替换魔法?

 my $string = $row =~ /magic/

3 个答案:

答案 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');'