用于获取文本的正则表达式

时间:2011-08-25 12:31:25

标签: regex perl

我有一个文本文件,其中包含用单引号括起来的名称。如何使用正则表达式获取文本包含的所有名称?

- "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)*)*/

但它仍然没有畏缩。请帮我弄清楚为什么我的正则表达式不起作用。

4 个答案:

答案 0 :(得分: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 :(得分:1)

您不需要将换行符与这些输入行匹配。我认为你的问题不在于正则表达式,而在于你处理数据的方式。只要您的单引号字符串不包含换行符,您就不需要对其进行补偿。

试试这个单行,例如:

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

如您所见,我使用全局选项/g来获取每一行的所有匹配。

进一步解释:

  • -n:假设程序周围有一个while (<>)循环(从文件中获取输入)
  • -E:单行程序,启用所有可选功能(即 say
  • $,:将OUTPUT_FIELD_SEPARATOR设置为换行符,以便所有匹配 由换行符分隔。

如果您将整个文本文件包含在字符串中,请尝试以下操作:

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

答案 2 :(得分:0)

使用非贪心量词:

/'(.*?)'/

/'([^']*)'/

答案 3 :(得分: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";
}