perl正则表达式分组超载

时间:2011-07-08 18:20:04

标签: regex perl

我正在使用以下perl正则表达式

$myalbum =~ s/[-_'&’]/ /g;
$myalbum =~ s/[,’.]//g;
$myalbum =~ m/([A-Z0-9\$]+) +([A-Z0-9\$]+) +([A-Z0-9\$]+) +([A-Z0-9\$]+) +([A-Z0-9\$]+)/i;

匹配以下字符串

"30_Seconds_To_Mars_-_30_Seconds_To_Mars"

"30_Seconds_To_Mars_-_A_Beautiful_Lie"

"311_-_311"

"311_-_From_Chaos"

"311_-_Grassroots"

"311_-_Sound_System"

我所遇到的是,对于少于5个匹配组的字符串(例如311 _-_ 311),尝试print $1 $2 $3根本不打印任何内容。只会打印超过5个匹配项的字符串。

如何解决此问题?

3 个答案:

答案 0 :(得分:3)

看起来你只想要单独的组中的单词。对我来说,当你可以运行你的替换然后拆分时,似乎你正在滥用正则表达式。只是做:

$myalbum =~ s/[-_'&’]/ /g;
$myalbum =~ s/[,’.]//g;
my @myalbum_list = split(/\s/, $myalbum);
#Print out whatever it is you want/ test length, etc...
print "$myalbum_list[0] $myalbum_list[1] $myalbum_list[2]";

答案 1 :(得分:1)

+字符表示至少一个匹配。这意味着您的正则表达式m/([A-Z0-9\$]+) +([A-Z0-9\$]+) + ...需要所有这些字段才能将其视为匹配项。你没有捕获任何东西的原因是因为它实际上并不匹配。

你可能正在寻找*字符,这意味着零或更多不是一个或多个像+

答案 2 :(得分:0)

我认为你的捕获组对于“311 - 311”是空的,因为这个字符串与你的正则表达式不匹配。

如何解决?使用*而不是+来允许空序列。

编辑:从你的帖子我想你想要提取专辑名称,即减号前的部分。

为什么不与'(.*) - (.*)'匹配,作为第一组专辑,第二组是标题。问题在于字符串如“专辑与减号 - 第一首曲目”或“我的专辑 - 曲目是一 - 二 - 三”。但作为一个人,你不会知道专辑的结束和曲目的开始。