0

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

Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)

我想制作一个看起来像这样的新数组:

Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff

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

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

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

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

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

4

2 回答 2

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;
于 2013-03-02T16:56:08.870 回答
0

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

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

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

my @newarray = map /^([^(]*[^\s(])/, @array;
于 2013-03-02T19:43:19.890 回答