Регулярное выражение для выборки текста - PullRequest
1 голос
/ 25 августа 2011

У меня есть текстовый файл, который содержит имена, заключенные в одинарные кавычки. Как мне сделать регулярное выражение, чтобы получить все имена, содержащиеся в тексте?

- "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 ]

3 голосов
/ 25 августа 2011

Я бы использовал 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 голос
/ 25 августа 2011

Вам не нужно сопоставлять символ новой строки с этими строками ввода. Я думаю, что ваша проблема связана не столько с регулярным выражением, сколько с тем, как вы обрабатываете ваши данные. Пока строки в одинарных кавычках не содержат символ новой строки, вам не нужно компенсировать это.

Попробуйте этот однострочный, например:

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

Как видите, я использую глобальную опцию /g, чтобы получить все совпадения из каждой строки.

Дополнительные пояснения:

  • -n: предположим, что while (<>) цикл вокруг программы (чтобы получить входные данные из файла)
  • -E: однострочная программа со всеми включенными дополнительными функциями (т.е. say)
  • $,: установить OUTPUT_FIELD_SEPARATOR на новую строку, чтобы все совпадения разделены новой строкой.

Если у вас есть весь текстовый файл в строке, попробуйте это:

my @matches = $string =~ /'([^']+)'/g;
0 голосов
/ 25 августа 2011

вы можете использовать это:

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";
}
0 голосов
/ 25 августа 2011

Используйте не жадный квантификатор:

/'(.*?)'/

или

/'([^']*)'/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...