Регулярное выражение PowerShell: замените каждую запятую на [пробел], если между ними нет значения

#regex #powershell

#регулярное выражение #powershell

Вопрос:

Регулярное выражение PowerShell: замените каждую запятую на [пробел], если между ними нет значения.

Необработанные данные:

 Name 1,Exported,Exported,Exported,Exported,Exported,Exported,Exported
Name 2,Exported,Exported,Exported,Exported,Exported,Exported,
Name 3,Exported,Exported,,Exported,Exported,,
  

Ожидаемый результат:

 Name 1,Exported,Exported,Exported,Exported,Exported,Exported,Exported
Name 2,Exported,Exported,Exported,Exported,Exported,Exported,[Blank]
Name 3,Exported,Exported,[Blank],Exported,Exported,[Blank],[Blank]

This is what I got so far:
```powershell
$data -replace ("(,W)|(,s)", ",[Blank],")
  

Однако это работает не так, как предполагалось.

Ответ №1:

В качестве шаблона вы могли бы использовать

 (?m),[^Srn]*(?=,|$)
  

Объяснение

  • (?m) Встроенный многострочный модификатор
  • , Сопоставьте запятую
  • [^Srn]* Сопоставьте 0 раз символ пробела без новой строки
  • (?=,|$) Позитивный взгляд, утверждайте, что справа находится либо запятая, либо конец, либо строка

И замените на

 ,[Blank]
  

Демонстрация регулярных выражений .NET | Демонстрация Powershell

введите описание изображения здесь

Например

 $data=@'
Name 1,Exported,Exported,Exported,Exported,Exported,Exported,Exported

Name 2,Exported,Exported,Exported,Exported,Exported,Exported,

Name 3,Exported,Exported,,Exported,Exported,,
'@
$data -replace ("(?m),[^Srn]*(?=,|$)", ",[Blank]")
  

Вывод

 Name 1,Exported,Exported,Exported,Exported,Exported,Exported,Exported

Name 2,Exported,Exported,Exported,Exported,Exported,Exported,[Blank]

Name 3,Exported,Exported,[Blank],Exported,Exported,[Blank],[Blank]
  

Комментарии:

1. Неплохо. Это сработало как шарм. Я делал это уже час 🙂 Спасибо!