我在数组中有一些具有这种模式的字符串:
Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)
我想创建一个如下所示的新数组:
Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff
我能够将带括号的模式与以下Perl正则表达式匹配:
$string =~ /(.*?)(\(.*?\))/;
push(@newarray, $1);
但是如果没有parantheses中的文本,这对那些字符串不起作用。我尝试了其他几个来匹配可选的parantheses,但似乎都没有:
$string =~ /(.*?)(?:\(.*?\))/;
$string =~ /(.*?)(\(.*?\))?/;
$string =~ /(.*?)(?:\(.*?\))?/;
如果有人可以提供帮助,我将不胜感激。谢谢!
答案 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;