Использовать регулярное выражение, чтобы найти строки в оболочку содержимого


Прямой вопрос: Как я могу использовать регулярное выражение lookarounds для поиска экземпляров rn, которые встречаются между набором символов (стоят в открытых и закрывающих тегах), "[ и ]" с произвольными символами и разрывами строк внутри?

Ситуация:

У меня есть большая база данных, экспортированная в текстовые файлы с разделителями или запятыми, которые я пытаюсь импортировать в excel. Проблема заключается в том, что некоторые ячейки берутся из текстовых областей, содержащих разрывы строк, и квалифицируются как двойные двойные кавычки. При импорте в excel эти разрывы строк обрабатываются как новые строки. Я не могу настроить способ экспорта файла. I данные должны быть сохранены, но точный формат этого не делает, поэтому я планировал использовать некоторый заполнитель для возврата
или ~

Вот общая иллюстрация формата моих данных:

column1rowA    column2rowA    column3rowA    column4rowA
column1rowB    column2rowB   "column3rowB
3Bcont
3Bcont
3Bcont

"    column4rowB
column1rowC    column2rowC                   column4rowC
column1rowD    column2rowD   "column3rowD
3Dcont"    column4rowD

Моя мысль состояла в том, чтобы попытаться выбрать и заменить разрывы строк в кавычках с помощью регулярного поиска и замены в Notepad++. Попробовать и сделать проще я уже пробовал добавление символа в двойные кавычки, чтобы указать, является ли это открывающая или закрывающая кавычка:

"[column3rowB
3Bcont
3Bcont
3Bcont

]"

Я новичок в регулярных выражениях. Прогресс, которого я добился (что не так уж и много), таков:

(?<="[) отсутствует какой-то подстановочный знак rn(?=.*]")

Каждая итерация, которую я пробовал, также включала каждый разрыв строки между первым "[ и последним ]"

Я также был бы признателен за любые другие подходы, которые решают основную проблему

2 2

2 ответа:

Если вы можете использовать какой-либо инструмент, отличный от Notepad++, вы можете использовать это регулярное выражение (см. Мой рабочий пример на regex101):

(?!\n(([^"]*"){2})*[^"]*$)\n

Он использует отрицательный lookahead для поиска разрывов строк только тогда, когда за ними не следует четное число кавычек. Вы можете заменить их на <br>, пробелы или все, что подходит.

Разбивка:

(?! ... ) это отрицательный взгляд, необходимый, потому что он нулевой ширины. Все, что соответствует ему, по-прежнему будет доступно для соответствия снова.

(([^"]*"){2})* это еще одна ключевая деталь. Он обеспечивает четные пары символов без кавычек, за которыми следует кавычка.

[^"]*$ это гарантирует, что там не будет больше кавычек до конца строки.

Предостережение: Я не смог заставить его работать в Notepad++, потому что он всегда распознает $ как конец строки, а не конец всей строки.

Отличный ответ от Брайана. Я добавил опцию, которая будет рассматривать только реальные переносы строк (т. Е. \Н\Р), который работал на моего CSV-файл:

(?!\n|\r(([^"]*"){2})*[^"]*$)\n|\r