2013-02-08 155 views
0

我是Perl新手,嘗試使用正則表達式來獲取兩個標記之間的一段字符串,我知道該字符串在那裏。我已經嘗試了從stackoverflow的各種答案,但他們似乎都沒有爲我工作。這裏是我的榜樣......Perl正則表達式,獲得兩個字符串之間的字符串

所需的數據是$信息變量外面我想要得到的有用的數據

my $info = "random text i do not want\n|BIRTH PLACE=Boston, MA\n|more unwanted random text"; 

在上面的字符串有用的數據是Boston, MA。我通過$info =~ s/\n//g;從字符串中刪除了換行符。現在$info有這個字符串"random text i do not want|BIRTH PLACE=Boston, MA|more unwanted random text"。我認爲這樣做會幫助我輕鬆捕獲所需的數據。

請幫我獲取所需的數據。我確信數據將始終以|BIRTH PLACE=開頭,併成功爲|。之前和之後的所有內容都是不需要的文本。如果這樣的問題已經得到解答,請指導我解答。謝謝。

回答

1
$info =~ m{\|BIRTH PLACE=(.*?)\|} or die "There is no data in \$info?!"; 
my $birth_place = $1; 

這應該做的伎倆。

+0

這一個工作就像一個魅力。謝謝。 – SagarG 2013-02-08 16:34:57

3

而不是取代周圍的一切,你可以搜索/\|BIRTH PLACE=([^\|]+)\n\|/,[^ \ |] +是anything that is not a pipe中的一個或多個。

1

你知道,實際上,這些換行符可能對你有所幫助。我會去爲一個初始的正則表達式:

/^\|BIRTH PLACE=(.*)$/m 

使用多改性劑(m)以在其末端有一個線和$的開始匹配^,而不是在一開始只是匹配和字符串的結尾。哎呀,你甚至可以得到真正瘋狂的比賽:

/(?<=^\|BIRTH PLACE=).+$/m 

只捕捉你想要使用回顧後((?<= ...))斷言,它的出生地信息的信息。

爲什麼詛咒字符串兩次,當你可以做一次?

所以,在Perl:

if ($info =~ m/(?<=^\|BIRTH PLACE=).+$/m) { 
    print "Born in $&.\n"; 
} else { 
    print "From parts unknown"; 
} 
1

您已經大概從文件中讀取,這是一個糟糕的開局,這個數據。你的程序應該是這樣的

use strict; 
use warnings; 

use autodie; 

open my $fh, '<', 'myfile'; 

my $pob; 
while (<$fh>) { 
    if (/BIRTH PLACE=(.+)/) { 
    $pob = $1; 
    last; 
    } 
} 

print $pob; 

輸出

Boston, MA 
相關問題