Примечание: для тестирования регулярных выражений я использую http://gskinner.com/RegExr/, что очень полезно.
Я не думаю, что вы можете написать одно выражение, которое заменит неопределенное количество новых строк. Тем не менее, вы можете написать выражение для замены одного или нескольких, и либо несколько раз запустить его, либо написать его, чтобы иметь дело с максимальным количеством новых строк, которые вы будете иметь в одном цитируемом разделе.
Во-первых, вам нужен однострочный режим, чтобы ваше выражение совпадало со всей входной строкой, а не построчно. Поместите это в начало вашего выражения, чтобы включить его:
(?s)
Затем вы хотите, чтобы выражение для поиска соответствовало начальной кавычке:
(?<=“)
И предварительный просмотр, чтобы соответствовать конечной цитате:
(?=”)
Теперь выражение соответствует некоторому тексту, затем новой строке, затем тексту:
([^”\r]*)\r?([^”\r]*)
Обратите внимание, что есть две группы захвата для фрагментов текста вокруг новой строки, поэтому вы можете включить этот текст в выражение замены. Это будет соответствовать тексту, который имеет только одну новую строку в кавычках. Чтобы расширить это до двух новых строк, просто добавьте еще один необязательный символ новой строки и необязательный следующий текст:
(?s)(?<=“)([^”\r]*)\r?([^”\r]*)\r?([^”\r]*)(?=”)
Вы можете расширить это, чтобы соответствовать столько строк, сколько вы думаете, может произойти. Не идеально, но, возможно, достаточно. Или, если вы можете повторно запустить выражение в вашем тексте, просто замените по одному за раз.
Оставив выражение вашего лица примерно так:
r.Replace("(?s)(?<=“)([^”\r]*)\r?([^”\r]*)", "$1 $2")
(Это не совсем правильно, поскольку после текста будет добавляться пробел, даже если вторая группа не совпадает ... но это только начало)