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');'
我正在逐行阅读 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');'