好的,我正在读取一个文件,其中一些行包含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
答案 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结尾。 。*? - 匹配中间的任何内容,但尽可能缩短匹配