代码之家  ›  专栏  ›  技术社区  ›  Andrew

如何仅替换正则表达式中捕获的元素?

  •  1
  • Andrew  · 技术社区  · 17 年前

    我试图使用正则表达式只提取字符串中的某些元素,我希望最终只得到捕获的组。

    (is|a) "This is a test" 而且只能返回 "is is a"

    .*?(is|a).*? replaced with $1
    

    但是,当我这样做时,只有最后找到/捕获的组之前的字符被删除——最后找到的组之后的所有字符都保留下来。

    is is a test.
    

    如何仅隔离和替换捕获的字符串(以 ),在PHP和Perl中?

    谢谢

    编辑: 我现在明白了,最好用 m// 而不是 s/// ,但如何将其应用于PHP的 preg_match ? 在我真正的正则表达式中,我捕获了几个组,结果 $1 $2 $3 等-- 预赛

    3 回复  |  直到 17 年前
        1
  •  6
  •   Sinan Ünür    17 年前

    s/// 操作人员你应该使用 m// . 如果下面的示例不符合您的需要,您可能需要对您的解释进行一点扩展:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $text = 'This is a test';
    
    my @matches = ( $text =~ /(is|a)/g );
    
    print "@matches\n";
    __END__
    
    C:\Temp> t.pl
    is is a
    

    对于PHP,您应该使用 preg_match_all

        2
  •  1
  •   Community Mohan Dere    9 年前

    s/// 始终替换比赛中包含的所有内容。您需要捕获附加项并将其包含在替换项中,或者使用断言来要求

    也就是说,我不认为这是你真正想要的。是 Sinan's answer

        3
  •  0
  •   Jherico    17 年前

    您将所有内容都放入捕获中,然后仅替换所需的内容。

    (.*?)(is|a)(.*?)
    
    推荐文章