如何进行简单的正则表达式匹配并在perl中分配操作?我是否正确使用:if($ file = ~m /(music \ /(。*)。*)$ /)

时间:2011-06-18 21:33:59

标签: regex perl

好的,我正在读取一个文件,其中一些行包含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 个答案:

答案 0 :(得分:1)

截断的第一个字母很奇怪,但尾随垃圾只是因为你使用.*,并且从不关闭它。 *+贪婪,并且尽可能地消耗所有角色,除非你告诉他们不要。由于.匹配任何字符,因此它将与字符串的其余部分匹配。

这可能就足够了:

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

即。使用mp3关闭匹配项,使用{}代替//以使其更容易上手,并使用i选项匹配不区分大小写(如果适用,则适用于您的情况)

答案 1 :(得分:1)

我不确定为什么你的例子中丢失了第一个数字。试试这个。

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

\w+将尽可能多地匹配字母,数字和_(下划线)。这使您可以匹配其他扩展名。如果您不想在文件夹中留出空格,请添加\s以使其(music(\/[^\/\s]+)+\.\w+)

匹配music后,(\/[^\/]+)匹配/,然后匹配所有不是/的字符。 +使其匹配多层文件夹。 \.\w+与扩展名匹配。

答案 2 :(得分:1)

尝试将regexp更改为:

if( $possibleMP3 =~ m/\(music\/([^\)]*)\)/ )

答案 3 :(得分:1)

音乐。*?mp3 - 依赖于该路径以音乐开头并以mp3结尾。 。*? - 匹配中间的任何内容,但尽可能缩短匹配