Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Парсинг строки при помощи регулярных выражений. Задачка на кавычки и пробелы.

#c_sharp #регулярные_выражения #синтаксический_анализ #powershell


Всю голову сломал себе =) из текстового файла читаются строки. В одной строке может
быть "несколько параметров". Нужно строчку разделить на эти параметры.
Есть несколько условий:


Параметры разделяются пробелами.


Параметр может содержать пробелы, но в это случае он обязательно должен быть заключен
в двойные кавычки ("").


Никто не запрещает заключать параметры без пробелов в кавычки.


Например нужно следующую строку разбить на три.
D:\test "D:\test\Название папки" "D:\test\test"

На выходе из функции должен получить 3 строки содержащие соответственно:
D:\test
D:\test\Название папки
D:\test\test

Подскажите, как бы мне это сделать? Использование string.split() не подходит в этом
случае, потому решил, что это нужно реализовывать при помощи regexp.match()...
Задача еще усложняется тем, что количество параметров может быть не ограничено. Под
концом строки подразумевается \r\n
Очередной раз благодарю Вас за помощь в моей задаче    


Ответы

Ответ 1



Попробуйте ".+?"|[^ ]+ Только надо будет удалять кавычки у параметров, у которых они есть.

Ответ 2



Вот вам ручной парсер (стащил отсюда): public static string[] SplitArguments(string commandLine) { var parmChars = commandLine.ToCharArray(); var inSingleQuote = false; var inDoubleQuote = false; for (var index = 0; index < parmChars.Length; index++) { if (parmChars[index] == '"' && !inSingleQuote) { inDoubleQuote = !inDoubleQuote; parmChars[index] = '\n'; } if (parmChars[index] == '\'' && !inDoubleQuote) { inSingleQuote = !inSingleQuote; parmChars[index] = '\n'; } if (!inSingleQuote && !inDoubleQuote && parmChars[index] == ' ') parmChars[index] = '\n'; } return (new string(parmChars)).Split(new[] {'\n'}, StringSplitOptions.RemoveEmptyEntries); } Поддерживает также и одинарные кавычки. Можно переписать в виде генератора, будет немного поэффективнее.

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

Отправить комментарий