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.

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

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。