Как написать регулярное выражение для разделение комманды?

На входе строка запуска какого-либо приложения вида

C:\temp\filename.bat a=123 b -n

Если в пути присутствуют пробелы, то добавляются апострофы

"C:\temp\program files\filename.exe" -noselect dbrid="aaaa"

Нужно разделить на:

Диск     Приложение                          Параметры
C:\      temp\filename.bat                   a=123 b -n
C:\      temp\program files\filename.exe     -noselect dbrid="aaaa"

Пока не очень представляю как написать, что если вначале была ", то она должна и завершать и в этом случае допустимы пробелы в пути. Можно конечно сделать как 2 шаблона и объеденить через | но наверняка можно сделать проще?

https://regex101.com/r/SmCBDA/1


Ответы (2 шт):

Автор решения: Ainar-G

Насколько я вижу, тут только через объединение и можно сделать. Вот пример для POSIX sed:

s/\([A-Z]:\\\)\([^ ]*\) \(.*\)\|"\([A-Z]:\\\)\(.*\)" \(.*\)/\1\4    \t\2\5    \t\3\6/
$ sed -f ./tmp.sed ./tmp.txt 
C:\     temp\filename.bat       a=123 b -n
C:\     temp\program files\filename.exe     -noselect dbrid="aaaa"

Вот пример для Go:

var re = regexp.MustCompilePOSIX(`([A-Z]:\\)([^ ]*) (.*)|"([A-Z]:\\)(.*)" (.*)`)
fmt.Printf("%#q\n", re.FindStringSubmatch(s))

Ссылка на Playground: https://play.golang.org/p/xlvjoulzTuM.

→ Ссылка
Автор решения: Wiktor Stribiżew

Вы можете воспользоваться "условным конструктом":

^(")?([a-zA-Z]:\\)((?(1)[^"]*|\S+))(?(1)")\s*(.*)$

См. пример работы выражения.

Подробности

  • ^ - начало строки
  • (")? - Подмаска №1: кавычка (опционально, захватывающая подмаска тут необязательная, однако шаблон внутри неё обязателен)
  • ([a-zA-Z]:\\) - Подмаска №1: буква из набора символов ASCII и :\
  • ((?(1)[^"]*|\S+)) - Подмаска №2: если подмаска №1 нашла совпадение, 0 и более символов, отличных от ", в противном случае 0 и более символов, отличных от пробельных символов
  • (?(1)") - если подмаска №1 нашла совпадение, " (в противном случае ничего не требуется)
  • \s* - ноль и более пробельных символов
  • (.*) - Подмаска №3: 0 и более символов, отличных от символов переноса строки
  • $ - конец строки.
→ Ссылка