Как сделать простое сопоставление регулярных выражений и назначить операцию в Perl?Я на правильном пути с: if ($ file = ~ m / (music \ / (. *). *) $ /) - PullRequest
0 голосов
/ 19 июня 2011

ОК, я читаю в файле, в котором некоторые строки содержат пути к mp3.Я знаю, что это простая проблема, но после долгих поисков и экспериментов я близко, но не совсем там.

Типичная строка в этом файле может выглядеть следующим образом:

This is some text and some more (music/rock/linkin_park/in_the_end.mp3) and some more text

Я хочу извлечь только часть музыки / рока / linkin_park / in_the_end.mp3.

Вотчто у меня есть:

  1 #!/usr/bin/perl -w
  2 
  3 $infile = "somefile.txt";
  4 $possibleMP3 = "";
  5 open(DAT, $infile);
  6 
  7 while (<DAT>) {
  8     chomp;
  9     $possibleMP3 = $_;
 10     if( $possibleMP3 =~ m/(music\/(.*).*)$/ )
 11     {   
 12         print "$1 \n";
 13     }
 14 }   
 15 
 16 close (DAT); 

Когда строка соответствует, вывод будет выглядеть следующим образом:

 usic/rock/linkin_park/in_the_end.mp3) and here is some more text and more and more.

Первая буква усекается, и есть конечный мусор.

Спасибо за любую помощь с этим запутанным, но полезным языком: P

Ответы [ 4 ]

1 голос
/ 19 июня 2011

music. *? Mp3 - полагается, что путь начинается с музыки и заканчивается mp3.. *?- сопоставить что-либо между, но сделать матч как можно короче

1 голос
/ 19 июня 2011

Я не уверен, почему первая цифра теряется в вашем примере. Попробуйте вместо этого.

if( $possibleMP3 =~ m/(music(\/[^\/]+)+\.\w+)/ )
{
   print "$1 \n";
}

\w+ будет совпадать с буквами, цифрами и символом _ (подчеркивание) столько раз, сколько может. Это позволяет вам соответствовать другим расширениям. Если вы не хотите оставлять пробелы в папках, добавьте \s, чтобы сделать его (music(\/[^\/\s]+)+\.\w+).

После сопоставления music, (\/[^\/]+) соответствует /, а затем все символы, которые не /. + позволяет сопоставлять несколько слоев папок. \.\w+ соответствует расширению.

1 голос
/ 19 июня 2011

Попробуйте изменить регулярное выражение на это:

if( $possibleMP3 =~ m/\(music\/([^\)]*)\)/ )
1 голос
/ 19 июня 2011

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

Этого, вероятно, будет достаточно:

$possibleMP3 =~ m{(music/[\w/]+\.mp3)}i

Т.е. закройте совпадение с помощью mp3, используйте {}вместо //, чтобы облегчить глаза, и используйте опцию i, чтобы нечувствительно соответствовать регистру (если это уместно в вашем случае).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...