2011-08-25 160 views
1

我有一個文本文件,其中包含用單引號括起來的名稱。我如何做一個正則表達式來獲取文本包含的所有名稱?提取文本的正則表達式

- "Lady of Spain" (uncredited) 
    Music by 'Tolchard Evans' (qv) 
    Lyrics by 'Robert Hargreaves (II)' (qv), 'Stanley Damerell' (qv) and 'Henry B. Tilsley' (qv) 
    Performed by 'Jack Haig' (qv) and 'Kenneth Connor' (qv) 

這是我能想出來的。

/(\'(.*)\')*/ 

但是,期間只匹配到換行符。所以我修改了正則表達式包括

/(\'(.*)\'.*(\n|\r\n)*)*/ 

但它仍然沒有參與。請幫我弄清楚爲什麼我的正則表達式不起作用。

+0

您似乎不需要爲該輸入匹配換行符。 – TLP

+2

當單引號字符串本身包含單引號時,您的文本文件包含什麼?例如Kenneth O'Conner – tadmc

回答

3

我會使用split代替:

#!/usr/bin/env perl 

while (<DATA>) { 
    chomp(); 
    @values = split(/('.*?')/); 
    foreach my $val (@values) { 
     print "$val\n" if ($val =~ m/^'/) 
    } 
} 

__DATA__ 
- "Lady of Spain" (uncredited) 
    Music by 'Tolchard Evans' (qv) 
    Lyrics by 'Robert Hargreaves (II)' (qv), 'Stanley Damerell' (qv) and 'Henry B. Tilsley' (qv) 
    Performed by 'Jack Haig' (qv) and 'Kenneth Connor' (qv) 

輸出:

'Tolchard Evans' 
'Robert Hargreaves (II)' 
'Stanley Damerell' 
'Henry B. Tilsley' 
'Jack Haig' 
'Kenneth Connor' 
+1

'說for(grep/^'/,split /('.*?')/);':-)很好的使用非破壞性拆分。 – TLP

0

使用非貪婪量詞:

/'(.*?)'/ 

/'([^']*)'/ 
1

你並不需要與輸入的那些行匹配換行符。我認爲你的問題不在於正則表達式,而在於你如何處理數據。只要您的單引號字符串不包含換行符,您就不需要對此進行補償。

嘗試使用下面的襯板,例如:

perl -nwE '$,="\n"; say /\'([^']+)\'/g;' quotes.txt 

正如你所看到的,我用的是全局選項/g獲得每行的所有比賽。

進一步解釋:

  • -n:假定程序圍繞while (<>)環(來從文件輸入)
  • -E:一個在線程序,啓用所有可選功能(即 say
  • $,:將OUTPUT_FIELD_SEPARATOR設置爲換行符,以便所有匹配的 以換行符分隔。

如果你有一個字符串在整個文本文件,試試這個:

my @matches = $string =~ /'([^']+)'/g; 
+0

bash:意外標記附近的語法錯誤'(' –

+0

@Fredrik shell搞亂了單引號..我在windows上,所以我不知道如何解決這個問題。 – TLP

+0

我知道,引用當你需要引用引號字符時有點混亂:-) –

0

你可以使用這個:

open FILE, "myfile" or die "Couldn't open file: $!"; 
#read file to sting 
while (<FILE>){ 
    $string .= $_; 
} 
close FILE; 

#match regex with right order and put to array 
while ($string =~ m/'(.*?)'/g) { 
    $hash{$1} = ++$i unless $hash{$1}; 
} 
@array = sort {$hash{$a} <=> $hash{$b}} keys %hash; 

#print array 
foreach (@array) { 
    print $_ . "\n"; 
}