在 Perl 中替换多个子字符串

Substitute multiple substrings in Perl

我正在尝试匹配在 Perl 中看起来像这样的字符串

%TRMMHDT128F422F115<SEP>SOJEZBM12A6D4FEA96<SEP>Thursday<SEP>A Hole In The World (Album Version) [etc]

字符串的末尾并不总是带有圆括号 and/or。我想要做的是删除歌曲周围的所有绒毛,并最终删除歌曲中的所有标点符号。我目前可以通过以下语句分两次执行此操作:

$line =~ s/.*>//;
$line =~ s/(\(.*)|(\[.*)//;

我想一次完成所有这些,但是如果我在第一个表达式之后和第二个表达式之前添加管道 |,它不会删除圆括号或方括号中的任何内容。像这样:

$line =~ s/.*>|(\(.*)|(\[.*)//;

现在在正则表达式测试器中,它匹配了我希望它匹配的所有内容,但它并没有替换所有内容。

试试这个:

$line =~ s/(.*>)(.*)(\(.*)//;

它的作用是匹配该模式的整行,并将整行替换为歌曲名称 $2。

在 Perl 中替换多个子字符串:

$line =~ s/.*>|(\(.*)|(\[.*)//g;

在 Perl 正则表达式中,g 修饰符不断应用 RegEx 直到它停止匹配。

尽管最后两个条件几乎相同,我可能会将其合并为:

$line =~ s/.*>|([([].*)//g;