2015-10-13 76 views
-2

文件名,我讀通過線上的XML文件中的行,我我所關心的是,如果線Perl的提取與正則表達式

看起來是這樣的:

<DBGen Include="FileIWant.dbd" /> 

我需要一個新的字符串,包含:

"FileIWant" 

如何用正確的正則表達式替換magic?

my $string = $row =~ /magic/ 

回答

1
my $string = $row =~ m/(.*)Include="(.*)\.(.*)".*/; 

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

輸出:

FileIWant 
1

呃..

$file_string = /Include="([^\."]*)\.[^\."]*"/ 
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');' 
+0

不幸的是遺留代碼必須在沒有安裝額外庫的構建系統上運行 –

+0

這是不幸的。你所擁有的只是一把錘子,而這裏的工作就是用螺絲釘。我建議最好的行動方式是要求做出適當工作所需的額外工具,但如果您希望增加技術債務,那就去做吧。 – Sobrique