【问题标题】:Substitute multiple substrings in Perl在 Perl 中替换多个子字符串
【发布时间】:2015-04-13 22:49:37
【问题描述】:

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

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

字符串的末尾并不总是有括号和/或方括号。我想要做的是去除歌曲周围的所有绒毛,最终去除歌曲中的所有标点符号。我现在可以用这些语句分两遍来做到这一点:

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

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

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

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

【问题讨论】:

    标签: regex perl


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢!我想我现在也知道如何使用其余的标点符号了。
    【解决方案2】:

    试试这个:

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

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

    【讨论】:

    • 更接近 OP 的意图可能是:$line =~ s/(.*&gt;)(.*)([([].*)/$2/;
    猜你喜欢
    • 2022-01-08
    • 2013-05-25
    • 2017-12-06
    • 1970-01-01
    • 2016-09-10
    • 2021-06-13
    • 2019-04-19
    相关资源
    最近更新 更多