【问题标题】:perl regex grouping overloadperl 正则表达式分组重载
【发布时间】:2011-07-09 03:50:52
【问题描述】:

我正在使用以下 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 个匹配的字符串才会打印。

我该如何解决这个问题?

【问题讨论】:

  • 我没有将您列表中的单个字符串与该正则表达式匹配。你已经用下划线把你的字符串牢固地粘在一起了,但是你希望通过你的表达式有空格。只需(\w+)-(\w+) 就可以根据我在其中看到的内容起作用。
  • 对不起,我省略了一些额外的正则表达式行
  • 给我们更多关于你更大意图的背景信息。您似乎想要来自"$artist $title" 的前五个字,但如果他们都有很多字怎么办?当渲染为"Pink Floyd Several Species of" 时,“几种毛茸茸的小动物聚集在一个洞穴中并用一个 Pict 开槽”似乎失去了它的一些特色。

标签: regex perl


【解决方案1】:

看起来您只想要不同组中的单词。对我来说,当您可以运行替换然后拆分时,您似乎正在滥用正则表达式来做到这一点。做吧:

$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]";

【讨论】:

    【解决方案2】:

    + 字符表示至少一个匹配项。这意味着您的正则表达式 m/([A-Z0-9\$]+) +([A-Z0-9\$]+) + ... 要求所有这些字段都存在,以便将其视为匹配项。您没有捕获任何内容的原因是因为它实际上并不匹配。

    您可能正在寻找 * 字符,它表示零个或多个而不是一个或多个,例如 +

    【讨论】:

    • 不,加号不是问题。如果你用星号替换它们,你将有一个匹配任何东西的正则表达式,因为一切都是可选的。
    【解决方案3】:

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

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

    编辑:从您的帖子中,我猜您想提取专辑名称,即减号之前的部分。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-18
      • 1970-01-01
      • 2014-04-03
      • 2021-09-06
      相关资源
      最近更新 更多