在Perl中替换多个子字符串

时间:2015-02-09 18:28:03

标签: regex perl

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

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

字符串的末尾并不总是括号和/或括号。我想要做的是删除歌曲周围的所有绒毛,并最终删除歌曲中的所有标点符号。我现在可以用这些陈述两次通过:

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

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

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

现在在一个正则表达式测试器中,这匹配了我想要匹配的所有内容,但它并不能代替所有内容。

2 个答案:

答案 0 :(得分:1)

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

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

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

虽然最后两个条件几乎相同,但我可能会把它合并到:

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

答案 1 :(得分:0)

试试这个:

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

这样做是因为它匹配该模式的整行,并用$ 2替换整行,这是歌曲标题。