首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正则表达式可选匹配

正则表达式可选匹配
EN

Stack Overflow用户
提问于 2013-03-03 00:54:37
回答 2查看 72关注 0票数 0

我在一个数组中有几个字符串,它们属于这种模式:

代码语言:javascript
运行
复制
Aaaaa
Bbbbb (Ccccc)
Ddddd
Eeeee
Fffff (Ggggg)

我想做一个新的数组,看起来像这样:

代码语言:javascript
运行
复制
Aaaaa
Bbbbb
Ddddd
Eeeee
Fffff

我可以将包含括号的模式与以下Perl正则表达式进行匹配:

代码语言:javascript
运行
复制
$string =~ /(.*?)(\(.*?\))/;
push(@newarray, $1);

但是对于那些在段落中没有文本的字符串,这将不起作用。我已经尝试了其他一些方法来匹配可选的parantheses,但似乎都不起作用:

代码语言:javascript
运行
复制
$string =~ /(.*?)(?:\(.*?\))/;
$string =~ /(.*?)(\(.*?\))?/;
$string =~ /(.*?)(?:\(.*?\))?/;

如果有人能帮忙,我将不胜感激。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-03 00:56:09

您要查找的模式是:

代码语言:javascript
运行
复制
/^(.*?)(?: \(.*\))?\z/

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

解决方案:

代码语言:javascript
运行
复制
my @b = @a;
s/ \(.*\)// for @b;

代码语言:javascript
运行
复制
use List::MoreUtils qw( apply );
my @b = apply { s/ \(.*\)// } @a;

或(5.14+)

代码语言:javascript
运行
复制
my @b = map s/ \(.*\)//r, @a;
票数 3
EN

Stack Overflow用户

发布于 2013-03-03 03:43:20

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

代码语言:javascript
运行
复制
my @newarray = map /^(\S+)/, @array;

如果它可以包含空格,则

代码语言:javascript
运行
复制
my @newarray = map /^([^(]*[^\s(])/, @array;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15176992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档