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



我使用的是PHP正则表达式。考虑这样的文本:

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

我需要匹配括号内的换行符,但不匹配括号外的换行符(如后两个)。我当前的regex看起来是这样的:/([^)]*([rn]+)[^(]*)/s,但是由于嵌套的大括号,它没有捕获"sit"one_answers"amet"之间的换行符。我可以只使用regex吗?还是必须手动解析文本?

您可以用递归正则表达式匹配所有嵌套的括号,然后删除preg_replace_callback内匹配值中的所有CRLF序列。

使用此正则表达式匹配嵌套的括号:

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

这里有一个PHP演示:

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

输出:

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

此外,请参阅php.net上的Recursive patterns

最新更新