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


How to match newlines inside (possibly nested) parentheses? (regex)

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

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

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

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

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

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

这里有一个PHP演示:

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

输出:

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

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