首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex:删除方括号中的内容

Regex:删除方括号中的内容
EN

Stack Overflow用户
提问于 2011-03-24 03:36:19
回答 5查看 7.5K关注 0票数 3

有没有一个正则表达式可以与搜索/替换一起使用来删除方括号(和括号)中出现的所有内容?

我试过\[.*\],它会吞噬额外的东西(例如"[chomps] extra [stuff]")

此外,当有嵌套括号(例如"stops [chomping [too] early]!")时,惰性匹配\[.*?\]也不起作用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-03-24 03:50:38

尝试如下所示:

代码语言:javascript
复制
$text = "stop [chomping [too] early] here!";
$text =~ s/\[([^\[\]]|(?0))*]//g;
print($text);

它将打印:

代码语言:javascript
复制
stop  here!

一个简短的解释:

代码语言:javascript
复制
\[            # match '['
(             # start group 1
  [^\[\]]     #   match any char except '[' and ']'
  |           #   OR
  (?0)        #   recursively match group 0 (the entire pattern!)
)*            # end group 1 and repeat it zero or more times
]             # match ']'

上面的正则表达式将被替换为空字符串。

你可以在线测试它:http://ideone.com/tps8t

编辑

正如@ridgerunner提到的,您可以通过使*和字符类[^\[\]]匹配一次或多次并将其设置为possessive,甚至通过从组1创建non capturing group来更有效地创建正则表达式:

代码语言:javascript
复制
\[(?:[^\[\]]++|(?0))*+]

但是,只有在处理大型字符串时,才能真正提高速度(当然,您可以对其进行测试!)。

票数 11
EN

Stack Overflow用户

发布于 2011-03-24 03:49:15

对于正则表达式,这在技术上是不可能的,因为您匹配的语言不符合“正则”的定义。有一些扩展的正则表达式实现可以使用递归表达式来完成此任务,其中包括:

Greta:

http://easyethical.org/opensource/spider/regexp%20c++/greta2.htm#_Toc39890907

PCRE

http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions

请参阅“递归模式”,其中有一个圆括号示例。

PCRE递归括号匹配将如下所示:

代码语言:javascript
复制
\[(?R)*\]

编辑:

由于您添加了使用Perl,这里有一个页面显式地描述了如何在Perl中匹配平衡的运算符对:

http://perldoc.perl.org/perlfaq6.html#Can-I-use-Perl-regular-expressions-to-match-balanced-text%3f

类似于:

代码语言:javascript
复制
$string =~ m/(\[(?:[^\[\]]++|(?1))*\])/xg;
票数 5
EN

Stack Overflow用户

发布于 2011-03-24 05:32:38

由于您使用的是Perl,因此可以使用CPAN中的模块,而不必编写自己的正则表达式。查看Text::Balanced模块,该模块允许您从平衡分隔符中提取文本。使用此模块意味着,如果分隔符突然更改为{},则不必弄清楚如何修改繁琐的正则表达式,只需在一次函数调用中更改分隔符参数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5410652

复制
相关文章

相似问题

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