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

Функция External Tools сделает то, что вы просите; Вы можете создать «внешний инструмент» с именем kubectl-apply с любой из поддерживаемых ими переменных, а затем вызвать его с помощью любого количества встроенных механизмов

the IntelliJ External Tools configuration dialog

6
задан Horcrux7 13 October 2008 в 10:48
поделиться

7 ответов

Я склонен использовать regexlib для этого вида проблемы. Если Вы переходите в: http://regexlib.com/ и поиск "командной строки", Вы найдете три результата, которые похожи, они пытаются решить это, или подобными проблемами - должно быть хорошее начало.

Это может работать: http://regexlib.com/Search.aspx?k=command+line&c=-1&m=-1&ps=20

6
ответ дан 8 December 2019 в 03:28
поделиться

Вы не должны использовать регулярные выражения для этого. Запишите синтаксический анализатор или используйте тот, обеспеченный Вашим языком.

Я не вижу, почему я получаю downvoted для этого. Это - то, как это могло быть сделано в Python:

>>> import shlex
>>> shlex.split('"param 1" param2 "param 3"')
['param 1', 'param2', 'param 3']
>>> shlex.split('"param 1" param2 "param 3')
Traceback (most recent call last):
    [...]
ValueError: No closing quotation
>>> shlex.split('"param 1" param2 "param 3\\""')
['param 1', 'param2', 'param 3"']

Теперь скажите мне, что разрушение Вашего мозга о том, как regex решит эту проблему, когда-либо стоит стычки.

14
ответ дан 8 December 2019 в 03:28
поделиться

Без учета на язык реализации, Ваш regex мог бы выглядеть примерно так:

("[^"]*"|[^"]+)(\s+|$)

Первая часть "[^"]*" ищет заключенную в кавычки строку, которая не содержит встроенные кавычки и вторую часть [^"]+ ищет последовательность несимволов кавычки. \s+ соответствует отделяющейся последовательности пробелов, и $ соответствует концу строки.

5
ответ дан 8 December 2019 в 03:28
поделиться

Большинство языков имеет другие функции (или встроенный или обеспеченный стандартной библиотекой), который проанализирует командные строки намного более легко, чем создание Вашего собственного regex, плюс Вы знают, что они сделают это точно из поля. Если Вы редактируете свое сообщение для идентификации языка, который Вы используете, я уверен, что кто-то здесь сможет указать на Вас на того, используемого на том языке.

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

2
ответ дан 8 December 2019 в 03:28
поделиться

Если его просто кавычки, по поводу которых Вы волнуетесь, то просто пишут простой цикл для дампа символа символом к строке, игнорирующей кавычки.

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

0
ответ дан 8 December 2019 в 03:28
поделиться

Что-то как:

"(?:(?<=")([^"]+)"\s*)|\s*([^"\s]+)

или более простой:

"([^"]+)"|\s*([^"\s]+)

(только ради нахождения regexp ;))

Примените его несколько времен, и группа n°1 даст Вам параметр, окружается ли это двойными кавычками или нет.

0
ответ дан 8 December 2019 в 03:28
поделиться

(чтение Вашего вопроса снова, только до регистрации, я отмечаю Вас, говорит, что командная строка КАК строка, таким образом эта информация не может быть полезна для Вас, но поскольку я записал это, я отправлю так или иначе - игнорируйте, если я неправильно понял Ваш вопрос.)

Если Вы разъясните свой вопрос, то я попытаюсь помочь, но из замечаний общего порядка, которые Вы сделали, я сказал бы, не делают этого :-), Вы просите regexp разделять серию parmeters в массив. Вместо того, чтобы делать это самостоятельно я настоятельно рекомендовал бы, чтобы Вы рассмотрели использование getopt, существуют версии этой библиотеки для большинства языков программирования. Getopt сделает то, что Вы спрашиваете, и масштабы для управления намного более сложной обработкой аргумента должны Вы требовать этого в будущем.

Если Вы сообщите мне, какой язык Вы используете, то я попытаюсь отправить образец для Вас.

Вот образец домашних страниц:

http://www.codeplex.com/getopt (.NET)

http://www.urbanophile.com/arenn/hacking/download.html (Java)

Образец (от страницы Java выше)

 Getopt g = new Getopt("testprog", argv, "ab:c::d");
 //
 int c;
 String arg;
 while ((c = g.getopt()) != -1)
   {
     switch(c)
       {
          case 'a':
          case 'd':
            System.out.print("You picked " + (char)c + "\n");
            break;
            //
          case 'b':
          case 'c':
            arg = g.getOptarg();
            System.out.print("You picked " + (char)c + 
                             " with an argument of " +
                             ((arg != null) ? arg : "null") + "\n");
            break;
            //
          case '?':
            break; // getopt() already printed an error
            //
          default:
            System.out.print("getopt() returned " + c + "\n");
       }
   }
-3
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: