我在一个数组中有几个字符串,它们属于这种模式:
Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)我想做一个新的数组,看起来像这样:
Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff我可以将包含括号的模式与以下Perl正则表达式进行匹配:
$string =~ /(.*?)(\(.*?\))/;
push(@newarray, $1);但是对于那些在段落中没有文本的字符串,这将不起作用。我已经尝试了其他一些方法来匹配可选的parantheses,但似乎都不起作用:
$string =~ /(.*?)(?:\(.*?\))/;
$string =~ /(.*?)(\(.*?\))?/;
$string =~ /(.*?)(?:\(.*?\))?/;如果有人能帮忙,我将不胜感激。谢谢!
发布于 2013-03-03 00:56:09
您要查找的模式是:
/^(.*?)(?: \(.*\))?\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-03 03:43:20
如果在初始字符串中从来没有空格,那么您可以只写
my @newarray = map /^(\S+)/, @array;如果它可以包含空格,则
my @newarray = map /^([^(]*[^\s(])/, @array;https://stackoverflow.com/questions/15176992
复制相似问题