Perl 使用正则表达式提取文件名

Perl extract filenames with regex

我正在逐行阅读 xml 文件,我只关心

行是否

看起来像这样:

<DBGen Include="FileIWant.dbd" />

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

"FileIWant"

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

 my $string = $row =~ /magic/

呃..

$file_string = /Include="([^\."]*)\.[^\."]*"/
my $string = $row =~ m/(.*)Include="(.*)\.(.*)".*/;

print , "\n";  #where  is the second parenthesis

输出:

FileIWant

不要使用正则表达式来解析 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');'