В Notepad++, как заменить текст между двумя разделителями на несколько строк

Файл с разделителями-запятыми создается при экспорте контактов Google в так называемый "формат Google CSV (для импорта в учетную запись Google)". Проблема заключается в том, что этот формат обрабатывает заметки в несколько строк, вставляя текст в кавычки и позволяя использовать CRLF с этими кавычками.

Другими словами, представьте, что запись с именем, примечанием, электронной почтой, если она имеет многострочную заметку, выглядит следующим образом в файле.csv:

Имя "Примечание FirstLine \ r \ n

SecondNoteLine \ г \ п

Lastnoteline",email.addr@domain.net\ г \ п

Та же запись без поля примечания выглядит следующим образом и находится в одной строке (более стандартно):

Имя,,email.addr@domain.net\ г \ п

Я пытаюсь сформировать правильное выражение регулярного выражения, и попытался извлечь его из Как использовать регулярные выражения в Notepad++ (учебник), но безрезультатно.

Самое близкое, что я получил (не очень близко),
\ "*,\"

с. Соответствующий перевод строки.

Выражение, которое я пытаюсь сопоставить:

"Выберите текст между" и ", только если есть один или несколько /r/n " "и замените его на NUL"

Так что в приведенных выше примерах обе записи будут идентичны, и я смогу заставить каждую запись контакта отображаться в одной строке и иметь возможность импортировать ее в Excel.

В этот момент мои глаза кровоточат, и любая помощь будет оценена.

1 ответ

Решение

Нижеследующее работает для меня с Notepad++ так же, как вы объясняете, что вам нужно, а также с примерами данных, которые вы предоставили в своем вопросе.

Огни,,

Камера.,,

  1. Найти то, что: ((?:^|\r\n)[^"]*+"[^\r\n"]*+)\r\n([^"]*+")
  2. Заменить: $1 $2
  3. Убедитесь, что опция Регулярное выражение включена
  4. Убедитесь, что опция Wrap Around отмечена
  5. Нажмите Replace All столько раз, сколько вам нужно, чтобы получить окончательные и ожидаемые результаты для ваших записей

Действие,,


Объяснение:

(
  (?:^|\r\n)     Begin at start of file or before the CRLF before the start of a record
  [^"]*+         Consume all chars up to the opening "
  "              Consume the opening "
  [^\r\n"]*+     Consume all chars up to either the first CRLF or the closing "
)                Save as capturing group 1 (= everything in record before the target CRLF)
\r\n             Consume the target CRLF without capturing it
(
  [^"]*+         Consume all chars up to the closing "
  "              Consume the closing "
)                Save as capturing group 2 (= the rest of the string after the target CRLF)

Примечание: *+ является собственническим квантификатором. Используйте их соответствующим образом, чтобы ускорить выполнение.

Обновить:

Эта более общая версия регулярного выражения будет работать с любой последовательностью разрыва строки (\r\n, \r или же \n):

((?:^|[\r\n]+)[^"]*+"[^\r\n"]*+)[\r\n]+([^"]*+")

Источник

Другие вопросы по тегам