我正在使用以下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个匹配项的字符串。
如何解决此问题?
答案 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”是空的,因为这个字符串与你的正则表达式不匹配。
如何解决?使用*而不是+来允许空序列。
编辑:从你的帖子我想你想要提取专辑名称,即减号前的部分。
为什么不与'(.*) - (.*)'
匹配,作为第一组专辑,第二组是标题。问题在于字符串如“专辑与减号 - 第一首曲目”或“我的专辑 - 曲目是一 - 二 - 三”。但作为一个人,你不会知道专辑的结束和曲目的开始。