我使用的是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
。