【问题标题】:Perl regex: Substitution of everything but the patternPerl 正则表达式:替换除模式之外的所有内容
【发布时间】:2016-12-20 08:44:02
【问题描述】:

在 perl 中,我想用任何东西替换一个否定的类字符集(除了模式之外的所有字符),只保留预期的字符串。通常,这种方法应该有效,但在我的情况下它不是:

$var =~ s/[^PATTERN]//g;

原字符串:

$string = '<iframe src="https://foo.bar/embed/b74ed855-63c9-4795-b5d5-c79dd413d613?autoplay=1&context=cGF0aD0yMSwx</iframe>'; 

希望得到的图案:b74ed855-63c9-4795-b5d5-c79dd413d613

(5 个十六进制数字组用 4 个破折号分隔)

我的代码:

$pattern2keep = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";  

(应仅匹配:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx(5 个十六进制数字组,用 4 个破折号分割),字符长度:8-4-4-4-12)

以下内容应该用任何东西代替除了模式之外的所有东西,但实际上它没有。

$string =~ s/[^$pattern2keep]//g;

请问我做错了什么?谢谢。

【问题讨论】:

    标签: regex perl substitution


    【解决方案1】:

    字符类匹配一个单个字符,该字符等于该类中的任何一个字符。如果该类以插入符号开头,则该类被否定,因此它匹配不是该类中任何字符的任何一个字符

    如果$pattern2keep[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12},那么[^$pattern2keep] 将匹配除-01248、@98765430 之外的任何字符987654331@、]af{}

    你需要捕获子字符串,像这样

    use strict;
    use warnings 'all';
    use feature 'say';
    
    my $string = '<iframe src="https://foo.bar/embed/b74ed855-63c9-4795-b5d5-c79dd413d613?autoplay=1&context=cGF0aD0yMSwx</iframe>';
    
    my $pattern_to_keep = qr/ \p{hex}{8} (?: - \p{hex}{4} ){3} - \p{hex}{12} /x;
    
    my $kept;
    
    $kept = $1 if $string =~ /($pattern_to_keep)/;
    
    say $kept // 'undef';
    

    输出

    b74ed855-63c9-4795-b5d5-c79dd413d613
    

    【讨论】:

    • 谢谢,它有效!这是一个很好的技巧,可以捕获子字符串而不是进行否定字符串替换。
    • @TomášLučenič:我不知道你从哪里得到“否定字符串替换”的想法。没有这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多