Вызвать метод разбора командной строки по умолчанию из любого приложения - PullRequest
2 голосов
/ 03 августа 2011

Я передаю сложную строку в качестве аргумента моего консольного приложения. Я заметил, что результирующий массив string[] args в моем методе Main - это то, что я хочу, чтобы эта строка была проанализирована.

Теперь я хочу иметь возможность анализировать строки этого формата и получать те же string[] в других частях моей инфраструктуры, вне моего консольного приложения / процесса , и не хочу заново изобрести колесо. Я попытался посмотреть, смогу ли я найти и вызвать метод фреймворка, который используется для разбора аргументов командной строки, которые передаются методу Main, но ничего не удалось найти. Я читал о некоторых параметрах синтаксического анализа командной строки, включая NDesk, но не могу использовать это в моей нынешней ситуации.

Кто-нибудь знает об этих базовых методах? Или есть другие идеи?

1 Ответ

1 голос
/ 03 августа 2011

Используйте регулярное выражение:

string input = "this is \"a string\" separated by spaces \"with quotes\" also";
Regex r = new Regex("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
var matches = r.Matches(input);

Приведите правильное объяснение:

[^\\s\"']+ соответствует 1+ символам с пробелом или двойной кавычкой

| ИЛИ

\"([^\"]*)\" соответствует 0+ символам внутри двойных кавычек, которые не являются самой двойной кавычкой

| ИЛИ

'([^']*)' соответствует 0+ символы внутри одной кавычки, которая сама по себе не является отдельной кавычкой

Кроме того, я не очень хорош в .net Regex, но, насколько я могу судить, они странные, когда дело доходит до соответствующих групп.Чтобы получить строку без кавычек, я должен был сделать странный цикл:

 var matches = r.Matches(input);
 foreach (Match match in matches)
 {
      Console.WriteLine(match.Groups[1].Value);
 }

Был вызов API, который вы могли бы сделать, если работаете в Windows (это * 1025)* поддерживается прошлая перспектива, независимо от того, что говорит pinvoke.net).Очевидно, это не кроссплатформенность.

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
   [MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine,
   out int pNumArgs);

Пример кода здесь

...