Как проверить аргументы с помощью Regex? - PullRequest
3 голосов
/ 09 сентября 2010

Я застрял с регулярными выражениями. Программа представляет собой консольное приложение, написанное на C #. Есть несколько команд. Я хочу проверить аргументы в первую очередь. Я думал, что с Regex это будет легко, но я не смог этого сделать:

var strArgs = "";

foreach (var x in args)
{
    strArgs += x + " ";
}
if (!Regex.IsMatch(strArgs, @"(-\?|-help|-c|-continuous|-l|-log|-ip|)* .{1,}"))
{
    Console.WriteLine("Command arrangement is wrong. Use \"-?\" or \"-help\" to see help.");
    return;
}

Использование:

program.exe [-options] [domains]

Проблема в том, что программа принимает все команды. Также мне нужно проверить "-" команды с префиксом перед доменами. Я думаю, что проблему не сложно решить.

Спасибо ...

Ответы [ 5 ]

4 голосов
/ 09 сентября 2010

Поскольку в итоге вы все равно напишете оператор switch для обработки опций, вам лучше выполнить проверку там:

switch(args[i])
{
case "-?": ...
case "-help": ...
...
default:
  if (args[i][0] == '-')
    throw new Exception("Unrecognised option: " + args[i]);
}
2 голосов
/ 09 сентября 2010

Во-первых, для разбора аргументов командной строки не используйте регулярные выражения. Вот связанный вопрос, на который, я думаю, вам стоит взглянуть:

Но для вашей конкретной проблемы с регулярным выражением - параметры являются необязательными, и затем вы сравниваете с пробелом, за которым следует что-либо вообще, где все может включать, например, недопустимые домены и / или недопустимые параметры. До сих пор пример это действует в соответствии с вашим регулярным выражением:

program.exe -c -invalid

Один из способов улучшить это, если быть более точным в отношении разрешенных символов в домене, а не просто сопоставлять что-либо.

Другая проблема с вашими регулярными выражениями заключается в том, что вы не допускаете пробелов между переключателями. Чтобы справиться с этим, вы, вероятно, хотите что-то вроде этого:

(?:(?:-\?|-help|-c|-continuous|-l|-log|-ip) +)*

Я также хотел бы отметить, что вы должны использовать string.Join вместо цикла, который вы используете в настоящее время.

string strArgs = string.Join(" ", args);
1 голос
/ 09 сентября 2010

Не изобретайте колесо, обработка аргументов командной строки - это решенная проблема.

Я хорошо использовал библиотеку синтаксического анализатора командной строки для .Net .

0 голосов
/ 03 февраля 2011

Я успешно использую эту функцию ... возможно, она будет полезна кому-то еще ...

Сначала определите ваши переменные:

private string myVariable1;
private string myVariable2;
private Boolean debugEnabled = false;

Затем выполните функцию:

loadArgs();

и добавьте функцию к своему коду:

    private void loadArgs()
    {
        const string namedArgsPattern = "^(/|-)(?<name>\\w+)(?:\\:(?<value>.+)$|\\:$|$)";
        System.Text.RegularExpressions.Regex argRegEx = new System.Text.RegularExpressions.Regex(namedArgsPattern, System.Text.RegularExpressions.RegexOptions.Compiled);
        foreach (string arg in Environment.GetCommandLineArgs())
        {
            System.Text.RegularExpressions.Match namedArg = argRegEx.Match(arg);
            if (namedArg.Success)
            {
                switch (namedArg.Groups["name"].ToString().ToLower())
                {
                    case "myArg1":
                        myVariable1 = namedArg.Groups["value"].ToString();
                        break;
                    case "myArg2":
                        myVariable2 = namedArg.Groups["value"].ToString();
                        break;
                    case "debug":
                        debugEnabled = true;
                        break;
                    default:
                        break;
                }
            }
        }
    }

и для его использования вы можете использовать синтаксис команды с косой чертой "/" или с тире "-":

myappname.exe /myArg1:Hello /myArg2:Chris -debug
0 голосов
/ 09 сентября 2010

На самом деле самый простой способ добиться синтаксического анализа аргументов командной строки - создать командлет PowerShell. Это дает вам действительно хороший способ работы с аргументами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...