Вопрос

Позвольте мне предвосхитить это, сказав, что я полный любитель, когда дело доходит до RegEx и началось всего несколько дней назад. Я пытаюсь решить проблему с форматированием файла и столкнулся с проблемой определенного типа данных. Входной файл имеет следующую структуру:

Two words,Word,Word,Word,"Number, number"

Что мне нужно сделать, так это отформатировать его ...

"Two words","Word",Word","Word","Number, number"

У меня был шаблон RegEx

s/,/","/g

работает, за исключением того, что он также заменяет запятую в уже указанном разделе Number, number, что приводит к разделению поля и разрыву файла. По сути, мне нужно изменить мой шаблон, чтобы заменить запятую на "quot;" [цитата запятая цитата], но только если за запятой нет пробела. Обратите внимание, что в других полях после запятой никогда не будет пробела, только список номеров с разделителями.

Мне удалось написать

s/,[A-Za-z0-9]/","/g

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

s/(,)[A-Za-z0-9]\b

должно работать, но это не так.

У кого-нибудь есть идея?

Это было полезно?

Решение

s /, ([^]) / ", $ 1 / будет соответствовать " , " за которым следует «not-a-space», захватывая not-a-space, а затем заменяя все это на захваченную часть.

В зависимости от того, какой движок регулярных выражений вы используете, вы можете писать \ 1 или другие вещи вместо $ 1 .

Если вы используете Perl или иным образом имеете доступ к механизму регулярных выражений с отрицательным прогнозом, s /, (?!) / " / (a " , " без пробела) работает.

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

Другие советы

По моему опыту, это не очень хорошее использование регулярных выражений. Как уже было сказано, CSV-файлы лучше обрабатываются настоящими CSV-парсерами. Вы не пометили язык, поэтому трудно сказать, но в perl я использую Text :: CSV_XS или DBD :: CSV (что позволяет SQL получать доступ к CSV-файлу, как к таблице, что, конечно, использует Text :: CSV_XS под обложками). Гораздо проще, чем мой собственный, и гораздо надежнее, чем использование регулярных выражений.

Похоже, вы используете Sed.

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

Через sed ваша команда будет выглядеть так:

  sed 's/[ \"]*,[ \"]*/\", \"/g'

Обратите внимание, что вам все равно придется ставить двойные кавычки в начале и конце строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top