doulai8128 2016-07-26 13:02
浏览 240
已采纳

如何匹配内部(可能是嵌套)括号中的换行符? (正则表达式)

I am using PHP regex. Consider a text like this:

Lorem ipsum (dolor sit 
amet (consectetur adipiscing
 elit) sed do eiusmod) tempor 
(incididunt) ut 
labore.

I need to match the newlines inside the brackets, but not the ones outside brackets (like the last two). My current regex looks like this: /\([^)]*([ ]+)[^(]*\)/s, however it doesn't capture the newline between "sit" and "amet" because of the nested brace. Can I make it work with regex only, or do I have to parse the text manually?

  • 写回答

1条回答 默认 最新

  • dousong5161 2016-07-26 13:09
    关注

    You may match all the nested parentheses with a recursive regex and then remove all CRLF sequences in the match values inside preg_replace_callback.

    Use this regex to match nested parentheses:

    '~\((?>[^()]++|(?R))*\)~'
    

    And here is a PHP demo:

    $re = '~\((?>[^()]++|(?R))*\)~'; 
    $str = "Lorem ipsum (dolor sit 
    amet (consectetur adipiscing
     elit) sed do eiusmod) tempor 
    (incididunt) ut 
    labore."; 
    $output = preg_replace_callback($re, function($m) {
        return str_replace("
    ", "", $m[0]);
    }, $str);
    echo $output;
    

    Output:

    Lorem ipsum (dolor sit amet (consectetur adipiscing elit) sed do eiusmod) tempor 
    (incididunt) ut 
    labore.
    

    Additionally, see Recursive patterns at php.net.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料