2014-01-07 50 views
0

我有下面的字符串,其中包含由(\ n)分隔的文本。我想使用正則表達式匹配xml內容,刪除所有空格和\ n並將其轉換爲單行。我使用了以下正則表達式:使用Perl正則表達式從字符串中分離XML內容

my $string = "this contains the text which I pasted below in before section"; 
$string=~ m/(^.*)(<[a-zA-Z]*>)/; 
$extractedXml = $2; 

爲什麼上面的代碼沒有得到XML內容?

前:

G11N/Locale=en_USY:/default/main/test1/test/test2/test4/test5/default.site 
G11N/Localizable=true 
TeamSite/Assocation/Version=1 
TeamSite/LiveSite/DeploymentAudit=<?xml version="1.0" encoding="UTF-8"?> 
<Deployments> 
    <test>hello</test> 
</Deployments> 

後:

Y:/default/main/test1/test/test2/test4/test5/default.site 
G11N/Locale=en_US 
G11N/Localizable=true 
TeamSite/Assocation/Version=1 
TeamSite/LiveSite/DeploymentAudit=<?xml version="1.0" encoding="UTF-8"?><Deployments><test>hello</test></Deployments> 

http://regex101.com/r/zZ0wB8
您可以檢查它在這裏工作,但在實際的代碼,它只是第一行匹配。

+0

你的正則表達式根本不匹配你的文本。請參閱http://regex101.com/r/pO5nW7。如果添加'/ m'修飾符,它至少會匹配第一個標記''。但它不能匹配''或任何結束標記,因爲您只允許使用其他字母。 – simbabque

回答

0

對於你的榜樣,下面的解決方案工作:

my $string = <<"FOO"; 
G11N/Locale=en_USY:/default/main/test1/test/test2/test4/test5/default.site 
G11N/Localizable=true 
TeamSite/Assocation/Version=1 
TeamSite/LiveSite/DeploymentAudit=<?xml version="1.0" encoding="UTF-8"?> 
<Deployments> 
    <test>hello</test> 
</Deployments>"; 
FOO 

$string =~ s/^\s+(<.+$)/$1/gm; 
$string =~ s/>\n/>/gm; 

print $string; 

它首先會從與東西看起來像XML標記和空白,並開始任何行刪除空格之後,在擺脫了換行符任何以xml標籤結尾的行結尾。

這是一個非常實用的方法,很可能不適用於所有情況。它只適用於unix文件,因爲\n

+0

http://regex101.com/r/zZ0wB8 檢查它在這裏工作,但在實際的代碼中,它只匹配第一行 –

+0

因爲在原始代碼中它沒有'/ g'標誌。 – simbabque

+0

在它的真實代碼中有/ g,否則爲什麼我會提到它 –

0

您可以使用此:

my ($xml) = $string =~ m!(<Deployments>.*?</Deployments>)!gis; 

問候。

+0

xml可以是任何不僅開始部署 –

+0

http://regex101.com/r/zZ0wB8檢查它在這裏工作,但在實際的代碼它只匹配firstline –

相關問題