【问题标题】:Regular expression to remove multiple parenthesis删除多个括号的正则表达式
【发布时间】:2012-06-13 00:05:17
【问题描述】:

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

示例:

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

想要的结果:

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

我不在乎用户是否是他们,只要他们不过度使用它们,并确保关闭它们。

感谢您的任何反馈。

【问题讨论】:

  • 按照哪些替换规则?匹配括号还是只是折叠连续的打开或关闭括号? -- 另外,你有没有尝试过?
  • ((fo(o)) ((bar)))(((((foo) 怎么样?

标签: php regex parentheses


【解决方案1】:

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

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

现在一些cmets:

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

2) 很难阅读,因为 ( ) 是特殊字符。基本上我是说“只要... 不包含任何(),就用(...) 替换每个((...))。老实说,我没有测试我写下的烂摊子,但是有了这个想法,你应该可以修复。

这总是成对地删除它们。

基本上,这里的寓意是:您问了一个简单的正则表达式无法解决的问题 - 成对删除需要比语言允许的更多状态。但是,如果您迭代简单的正则表达式并从内到外吃掉双打,那么这个结果就很容易实现。

【讨论】:

  • perl 用这个正则表达式报告一个错误。我把它改成这个s/\(\(([^()]*)\)\)/\(\1\)/g
【解决方案2】:

这很容易。

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

编辑:我没有阅读您的整个问题。你仍然需要括号,而不是重复。

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

【讨论】:

  • 似乎去掉了所有括号
  • 这对我很有用,但是如果输入是“Bob Barker LIVE!(((不要错过!))(”输出是“Bob Barker LIVE!(不要错过out!)(" 最后一个 "(" 没有关闭,应该删除。
  • @socca1157 您应该在 OP 中列出要求
  • @Esailija,虽然我想我不是很清楚,但我做到了。 “并确保关闭它们。”
【解决方案3】:

试试这个:

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

Demo

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      你可以试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        • 2014-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多