Звучит так, как будто вы хотите разрешить переводы строк внутри скобок, но не две или более строк новой строки подряд.Типичным регулярным выражением для этого может быть
'~\(((?:.|\n(?!\r?\n))*)\)~'
Но это не позволяет использовать различные типы новой строки (например, \r\n
или просто \r
), и не соответствует, если есть горизонтальные пробелы (например,пробелы или табуляции) в «пустой» строке.Это также не гарантирует, что круглые скобки правильно сбалансированы;Я не знаю, насколько это важно для вас.Попробуйте это регулярное выражение:
'~\(((?:[^\r\n()]|(?:\r\n|[\r\n])(?![ \t]*(?:\r\n|[\r\n]))|(?R))*+)\)~'
Первая альтернатива, [^\r\n()]
, соответствует чему-либо, что не является новой строкой (или ее частью) или скобками.
Если это не удается, (?:\r\n|[\r\n])
пытается сопоставить один из трех видов новой строки, и отрицательный прогноз (?![ \t]*(?:\r\n|[\r\n]))
гарантирует, что за новой строкой не следует другая новая строка, либо сразу, либо с пробелами или символами табуляции между ними.
Если третий вариантДостигнуто, следующий символ должен быть либо открытым, в этом случае (?R)
пытается применить все регулярное выражение рекурсивно;или близкий друг, в этом случае финал \)
завершает матч (или всплывает на следующий более высокий уровень рекурсии).
Конечно, это не учитывает возможность сбежатькруглые скобки, пробелы в Юникоде и разделители строк, или любое другое количество уточнений, но я просто демонстрирую, как применять правило не более одного символа новой строки , и объясняю, почему это труднее сделать, чем ваммог ожидать.