Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在perl中执行简单的正则表达式匹配和赋值操作?如果($file=~m/(music\/(.*)$/),我的思路是否正确_Regex_Perl - Fatal编程技术网

Regex 如何在perl中执行简单的正则表达式匹配和赋值操作?如果($file=~m/(music\/(.*)$/),我的思路是否正确

Regex 如何在perl中执行简单的正则表达式匹配和赋值操作?如果($file=~m/(music\/(.*)$/),我的思路是否正确,regex,perl,Regex,Perl,好的,我正在读一个文件,其中一些行包含mp3的路径。我知道这是一个简单的问题,但经过大量的搜索和实验,我接近了,但还不完全达到 此文件中的典型行可能如下所示: This is some text and some more (music/rock/linkin_park/in_the_end.mp3) and some more text 我只想提取 音乐/摇滚乐/林肯公园/in_the_end.mp3 部分 以下是我所拥有的: 1 #!/usr/bin/perl -w 2 3

好的,我正在读一个文件,其中一些行包含mp3的路径。我知道这是一个简单的问题,但经过大量的搜索和实验,我接近了,但还不完全达到

此文件中的典型行可能如下所示:

This is some text and some more (music/rock/linkin_park/in_the_end.mp3) and some more text
我只想提取 音乐/摇滚乐/林肯公园/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); 
第一个字母被截断,并且有尾随的垃圾


感谢您对这一混乱但有用的语言提供的帮助:p

截断的第一个字母很奇怪,但后面的垃圾只是因为您使用了
*
,并且从未关闭它
*
+
是贪婪的,它们会用尽所有可能的字符,除非你告诉它们不要这样做。由于
匹配任何字符,因此它将匹配字符串的其余部分

这可能就足够了:

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

例如,使用
mp3
关闭匹配,使用
{}
而不是
/
使其更容易看,并使用
I
选项不区分大小写(如果适用于您的情况)。

截断的第一个字母很奇怪,但后面的垃圾只是因为您使用了
*
,永远不要关闭它
*
+
是贪婪的,它们会用尽所有可能的字符,除非你告诉它们不要这样做。由于
匹配任何字符,因此它将匹配字符串的其余部分

这可能就足够了:

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

也就是说,用
mp3
关闭匹配,用
{}
代替
/
以使眼睛更容易看清,并使用
I
选项以不区分大小写的方式匹配大小写(如果适用于您的情况)。

我不确定您的示例中第一个数字丢失的原因。试试这个

if( $possibleMP3 =~ m/(music(\/[^\/]+)+\.\w+)/ )
{
   print "$1 \n";
}
\w+
将尽可能多次匹配字母、数字和(下划线)。这允许您匹配其他扩展。如果不想在文件夹中使用空格,请添加一个
\s
,使其成为
(音乐(\/[^\/\s]+)+\.\w+


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

我不确定您的示例中第一个数字丢失的原因。试试这个

if( $possibleMP3 =~ m/(music(\/[^\/]+)+\.\w+)/ )
{
   print "$1 \n";
}
\w+
将尽可能多次匹配字母、数字和(下划线)。这允许您匹配其他扩展。如果不想在文件夹中使用空格,请添加一个
\s
,使其成为
(音乐(\/[^\/\s]+)+\.\w+


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

尝试将regexp更改为:

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

尝试将regexp更改为:

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

音乐。*?mp3-路径以音乐开始,以mp3结束..*?-匹配中间的任何内容,但使匹配尽可能短。

音乐。*?mp3-依赖于路径以音乐开始,以mp3结束。*?-匹配中间的任何东西,但要尽量缩短匹配时间

效果很好。你能用简单的英语为我们凡人解释一下吗。我可以预见这种事情会再次发生。谢谢@ChirsD.I添加了一个解释(并针对多个文件夹进行了更正)。如果您有任何问题,我很乐意进一步解释。您可以考虑使用另一个DelMeq字符来进行模式匹配,因为<代码> /<代码>将在正则表达式中。另外,
\。\w+
将匹配任何文件扩展名。@Chris D:转到CPAN并安装(Regex::Explain)。然后Perl可以用简单的古英语向您解释复杂的正则表达式。这是一个易于使用的模块。感谢所有帮助我理解这一点的人。工作非常完美。你能用简单的英语为我们凡人解释一下吗。我可以预见这种事情会再次发生。谢谢@ChirsD.I添加了一个解释(并针对多个文件夹进行了更正)。如果您有任何问题,我很乐意进一步解释。您可以考虑使用另一个DelMeq字符来进行模式匹配,因为<代码> /<代码>将在正则表达式中。另外,
\。\w+
将匹配任何文件扩展名。@Chris D:转到CPAN并安装(Regex::Explain)。然后Perl可以用简单的古英语向您解释复杂的正则表达式。这是一个易于使用的模块。感谢所有帮助我理解这一点的人。但这也将符合
“我非常喜欢音乐。这是我的mp3列表”
;)但这也符合“我真的很喜欢音乐。这是我的mp3列表”;)