2013-12-26 2 views
1

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

В командной строке есть 3 необязательных параметра, -h -s -r, все они могут быть использованы, они могут вообще не использоваться.

Регулярное выражение у меня есть на данный момент

myapp.exe\s?(-h\s*)?\s?(-s\s*)\s?(-r\s*)? 

Должен ли я повторять \s?(-x\s*) для каждого параметра, или я могу сгруппировать их вместе? Что-то вроде \s?(-h,-r,-s\s*) было бы очень полезно!

Благодаря

+0

Возможно ли повторять те же параметры? Например. 'myapp.exe -h -h' – Jerry

+0

@Jerry Нет, их можно использовать только один раз, но в любом порядке. –

+0

Я думаю, что единственный способ сделать это - просто проанализировать командную строку как Windows, а затем проверить аргументы на достоверность. См. Этот ответ для деталей: [_Args_] (http://stackoverflow.com/questions/20303036/regular-expression-to-match-process-arguments/20303808#20303808) – sln

ответ

2

Вы можете использовать что-то вроде этого:

myapp\.exe\s?(-[hsr]\s*)* 

Не забывайте экранировать точки, если вы хотите, чтобы регулярное выражение, чтобы соответствовать буквальной точке.

[ ... ] - класс символов и будет соответствовать любому (или диапазону, если вы определяете какой-либо) символ внутри.

regex101 demo


EDIT: Для того, чтобы флаг не дублируются, вы можете использовать обратную ссылку и отрицательный предпросмотр, наряду с концом линии якоря:

myapp\.exe\s?(?:-([hsr])(?!.*\1)\s*)*$ 

\1 будет ссылаться на все, что зафиксировано в ([hsr])

(?! ...) будет отрицать совпадение, если какая-либо внутренняя позиция соответствует

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

+0

Блестящий, я знал, что это будет что-то простое, спасибо Джерри. –

+0

Я согласен через 6 минут :), но как я могу обеспечить, чтобы каждый из них только однажды использовался? –

+0

@BaliC Прошу прощения, я был афком за еду. Вы можете немного изменить его (это немного сложнее), и вы получите [это] (http://regex101.com/r/gP8mW7). – Jerry

Смежные вопросы