有没有一个正则表达式可以与搜索/替换一起使用来删除方括号(和括号)中出现的所有内容?
我试过\[.*\],它会吞噬额外的东西(例如"[chomps] extra [stuff]")
此外,当有嵌套括号(例如"stops [chomping [too] early]!")时,惰性匹配\[.*?\]也不起作用。
发布于 2011-03-24 03:50:38
尝试如下所示:
$text = "stop [chomping [too] early] here!";
$text =~ s/\[([^\[\]]|(?0))*]//g;
print($text);它将打印:
stop here!一个简短的解释:
\[ # 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来更有效地创建正则表达式:
\[(?:[^\[\]]++|(?0))*+]但是,只有在处理大型字符串时,才能真正提高速度(当然,您可以对其进行测试!)。
发布于 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递归括号匹配将如下所示:
\[(?R)*\]编辑:
由于您添加了使用Perl,这里有一个页面显式地描述了如何在Perl中匹配平衡的运算符对:
http://perldoc.perl.org/perlfaq6.html#Can-I-use-Perl-regular-expressions-to-match-balanced-text%3f
类似于:
$string =~ m/(\[(?:[^\[\]]++|(?1))*\])/xg;发布于 2011-03-24 05:32:38
由于您使用的是Perl,因此可以使用CPAN中的模块,而不必编写自己的正则表达式。查看Text::Balanced模块,该模块允许您从平衡分隔符中提取文本。使用此模块意味着,如果分隔符突然更改为{},则不必弄清楚如何修改繁琐的正则表达式,只需在一次函数调用中更改分隔符参数。
https://stackoverflow.com/questions/5410652
复制相似问题