Как обрабатывать встроенные запятые и кавычки в строке поиска регулярного выражения - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть файл CSV, и я хочу преобразовать

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, maecenas porttitor congue massa

в

<text>
   <name>Lorem ipsum dolor sit amet</name>
   <element>consectetuer adipiscing elit</element>
   <desc> maecenas porttitor congue massa</desc>
</text>

Я могу выполнить этот простой случай с помощьюВыражение поиска:

^([^,]*),([^,]*),([^,]*),
  • ^ - искать начало строки
  • ([^,]*), - искать ноль или более символов, которые не запятая, за которой следует запятая, и сгруппируйте ее (сделайте это 3 раза)

И выражение замены:

<text>\n   <name>$1</name>\n   <element>$2</element>\n   <desc>$3</desc>\n</test>\n

Это работает для простого случая.Однако иногда значение в CSV имеет встроенные запятые, и в этом случае значение заключено в кавычки.

Lorem ipsum dolor sit amet, "consectetuer, adipiscing elit", maecenas porttitor congue massa

Таким образом, второе значение (которое будет ) должно заканчиваться на:

<text>
   <name>Lorem ipsum dolor sit amet</name>
   <element>consectetuer, adipiscing elit</element>
   <desc> maecenas porttitor congue massa</desc>
</text>

То есть должно иметь встроенную запятую.Мне не нужно сохранять кавычки.

А затем, чтобы сделать его немного более запутанным, строка может также содержать кавычки, которые экранируются кавычками (или, по крайней мере, так мне дают CSV,который был сгенерирован из листа Google и сохранен в формате CSV)

Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa

Я хочу получить:

<text>
   <name>Lorem ipsum dolor sit amet</name>
   <element>and he said, "no way!", to my astonishment</element>
   <desc> maecenas porttitor congue massa</desc>
</text>

Так что должен иметь запятые и экранированные кавычки(с удаленным символом, который является второй кавычкой, удален).

Я заблудился при попытке создать регулярное выражение поиска.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Что-то в этом духе должно работать:

^\s* ( " (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*)), \s*(" (?:[^"]|(?:""))*" |(?:[^,]*))

Это в основном тот же шаблон ... Повторяется 3 раза.Пробел, за которым следует группа захвата, которая представляет собой последовательность не запятых или, предпочтительно, ", за которой следует (все, что не является ") ИЛИ "", за которым следует заключительная кавычка.

Вам нужно будет проверить кнопку «Игнорировать пробелы» по ссылке ниже.

regex storm

Использование нотации {3} вместоповторение шаблона 3 раза может сработать и даже может быть использовано для замены "", но я немного не уверен, как получить доступ к группам повторного захвата через пользовательский интерфейс

0 голосов
/ 29 ноября 2018

Я не эксперт по визуальным студийным кодам.Но я думаю, что это можно сделать без регулярных выражений

Следующий код Python должен дать представление

Ключ в том, чтобы игнорировать запятые, пока кавычки не будут спарены.

data = 'Lorem ipsum dolor sit amet, "and he said, ""no way!"", to my astonishment", maecenas porttitor congue massa'
items = data.split(',')
result = []

for i in range(len(items)):
    if (len(result) == 0):
        result.append(items[i])
        continue

    # If last item has odd number of quotes, it needs pairing - Ignore commas
    if (result[-1].count('"') % 2):
        # Append to last element
        result[-1] += ',' + items[i]
    else:
        result.append(items[i])

print("\n".join(result))

Вывод

Lorem ipsum dolor sit amet
 "and he said, ""no way!"", to my astonishment"
 maecenas porttitor congue massa

Пожалуйста, дайте мне знать, если вам нужно больше объяснений для кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...