Позвольте мне предварить это, сказав, что я полный любитель, когда дело доходит до RegEx, и начал только несколько дней назад. Я пытаюсь решить проблему форматирования файла, но у меня возникли проблемы с определенным типом данных. Входной файл имеет такую структуру:
Two words,Word,Word,Word,"Number, number"
Что мне нужно сделать, так это отформатировать его вот так ...
"Two words","Word",Word","Word","Number, number"
У меня был шаблон RegEx
s/,/","/g
работает, за исключением того, что он также заменяет запятую в уже процитированном разделе Number, number, что вызывает разделение поля и разрушение файла. По сути, мне нужно изменить свой шаблон, чтобы заменить запятую на "," [кавычка запятая цитата], но только тогда, когда за этой запятой не стоит пробел. Обратите внимание, что в других полях никогда не будет пробела после запятой, только список номеров с разделителями.
Мне удалось написать
s/,[A-Za-z0-9]/","/g
который при сопоставлении соответствующих строк заменит запятую И следующую букву. Я слышал о обратных ссылках и думаю, что это может быть то, что мне нужно использовать? Я так понимаю
s/(,)[A-Za-z0-9]\b
должно работать, но это не так.
У кого-нибудь есть идея?





s/,([^ ])/","/ будет соответствовать «,», за которым следует «not-a-space», захватывая not-a-space, а затем заменяя все это захваченной частью.
В зависимости от того, какой механизм регулярных выражений вы используете, вы можете писать или другие вещи вместо .
Если вы используете Perl или иным образом имеете доступ к механизму регулярных выражений с отрицательным просмотром вперед, s/,(?! )/","/ («,» без пробела) работает.
Однако ваш ввод выглядит как CSV, и если это действительно так, вам лучше проанализировать его с помощью настоящего парсера CSV, а не с помощью регулярных выражений. Есть много других странных случаев, о которых стоит беспокоиться.
s /, (?!) / "," / Сработало отлично, спасибо. Я использую Perl, поэтому могу запускать скрипт для файлов по мере их отправки. Сохраняет открытие его в парсере и работу с ним там. Кроме того, я все равно хотел изучить Perl и RegEx, так что два зайца одним выстрелом. Спасибо за вашу помощь :).
Мой опыт показывает, что это не очень хорошее использование регулярных выражений. Как уже было сказано, файлы CSV лучше обрабатываются настоящими парсерами CSV. Вы не пометили язык, поэтому сложно сказать, но в perl я использую Text :: CSV_XS или DBD :: CSV (что позволяет мне SQL получать доступ к CSV-файлу, как если бы это была таблица, что, конечно, использует Text :: CSV_XS под обложками). Намного проще, чем катить мой собственный, и намного надежнее, чем использование регулярных выражений.
Этот вопрос похож на: Замените шаблоны, находящиеся внутри разделителей, с помощью вызова регулярного выражения.
Это могло сработать:
s/"([^"]*)"|([^",]+)/""/g
Хех, это выполняет то, что хочет Исаак, вместо того, о чем он просил :) Вы могли бы быть немного интереснее и обрабатывать экранирование цитаты CSV тоже ... но нет особого смысла обрабатывать это с помощью регулярного выражения, когда предварительно созданные парсеры CSV могут делать лучше.
Я пошел на такой путь по двум основным причинам. Во-первых, я хотел изучить Perl, а потом мне показалось, что RegEx может решить эту проблему. Во-вторых, мне регулярно передают эти файлы, и возможность просто запустить против них скрипт экономит кучу времени.
Похоже, вы используете Sed.
Хотя ваш шаблон кажется немного непоследовательным, я предполагаю, что вы хотите, чтобы каждый элемент, разделенный запятыми, был заключен в кавычки. В противном случае вы смотрите на области вычислительной сложности, для обработки которых не предназначены регулярные выражения.
Через sed ваша команда будет:
sed 's/[ \"]*,[ \"]*/\", \"/g'
Обратите внимание, что вам все равно придется ставить двойные кавычки в начале и в конце строки.
Я хотел бы сделать это с помощью парсера CSV, но мне выдали эти файлы такими, какие они есть, без моего участия в фактическом формате. Так что я застрял в RegEx.