繁体   English   中英

正则表达式删除多个括号

[英]Regular expression to remove multiple parenthesis

我需要一个正则表达式,如果找到的话,它可以删除字符串中不必要的/多余的括号。

例:

Bob Barker LIVE! (((Don't Miss out!)))

想要的结果:

Bob Barker LIVE! (Don't Miss out!)

我不在乎是否会使用您,只要他们没有过度使用它们,并确保将其关闭即可。

感谢您的任何反馈。

您可以使用正则表达式+递归有效地做到这一点。 这样做直到停止执行任何操作:

s/\\(\\([^()]*)\\)\\)/\\(\\1\\)/g

现在一些评论:

1)我留给您将sed / perl样式转换为PHP样式正则表达式。

2)因为()是特殊字符,所以很难阅读。 基本上我说:“每次更换((...))(...)只要...不包含任何() 。而且说实话,我没有测试我写下来的烂摊子,但有了这个主意,您应该可以维修。

这总是将它们成对删除。

基本上,这里的道义是:您问了一个简单的正则表达式无法解决的问题-成对删除需要比语言允许的状态更多的状态。 但是,如果您遍历简单的正则表达式并从内而外吃双打,那么这是一个低落的果实。

那很容易。

preg_replace('~[\(\)]+~', '', $string);

编辑:我没有看完你的全部问题。 您仍然需要括号,但不能重复。

preg_replace(array('~\(+~', '~\)+~'), array('(', ')'), $string);

尝试这个:

preg_replace( '/\(+(.*?)\)+/', '($1)', 'Bob Barker LIVE! (((Don\'t Miss out!)))');

演示版

这不适用于嵌套括号,但是使用正则表达式确实很难做到这一点(并且取决于引擎,甚至是不可能的):

preg_replace(array('/\(+/', '/\)+/'), array('(', ')'), $text);

您可以尝试以下方法:

preg_replace("([\\(]{1,})", "(", preg_replace("([\\)]{1,})", ")", $your_string));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM