Как написать регулярное выражение для разделение комманды?
На входе строка запуска какого-либо приложения вида
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 и более символов, отличных от символов переноса строки$- конец строки.