正则表达式可选匹配

时间:2013-03-02 16:54:37

标签: regex perl

我在数组中有一些具有这种模式的字符串:

Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)

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

Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff

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

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

但是如果没有parantheses中的文本,这对那些字符串不起作用。我尝试了其他几个来匹配可选的parantheses,但似乎都没有:

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

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

2 个答案:

答案 0 :(得分:3)

您正在寻找的模式是:

/^(.*?)(?: \(.*\))?\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;

答案 1 :(得分:0)

如果初始字符串中从不存在任何空格,则可以只写

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

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

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