【问题标题】:Regular expression optional matching正则表达式可选匹配
【发布时间】:2013-03-02 16:54:36
【问题描述】:

我在一个数组中有几个字符串是这种模式:

Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)

我想创建一个如下所示的新数组:

Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff

我能够将带有括号的模式与以下 Perl 正则表达式匹配:

$string =~ /(.*?)(\(.*?\))/;
push(@newarray, $1);

但这不适用于那些没有括号中的文本的字符串。我尝试了其他几个来匹配可选的括号,但似乎没有一个有效:

$string =~ /(.*?)(?:\(.*?\))/;
$string =~ /(.*?)(\(.*?\))?/;
$string =~ /(.*?)(?:\(.*?\))?/;

如果有人可以提供帮助,我将不胜感激。谢谢!

【问题讨论】:

    标签: regex perl


    【解决方案1】:

    您正在寻找的模式是:

    /^(.*?)(?: \(.*\))?\z/
    

    如果您添加\z,您的最后两个将起作用。问题是.*? 很高兴匹配零个字符。


    解决方案:

    my @b = @a;
    s/ \(.*\)// for @b;
    

    use List::MoreUtils qw( apply );
    my @b = apply { s/ \(.*\)// } @a;
    

    或(5.14+)

    my @b = map s/ \(.*\)//r, @a;
    

    【讨论】:

      【解决方案2】:

      如果初始字符串中从来没有任何空格,那么你可以只写

      my @newarray = map /^(\S+)/, @array;
      

      如果它可能包含空格,那么

      my @newarray = map /^([^(]*[^\s(])/, @array;
      

      【讨论】:

        猜你喜欢
        • 2020-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多