Во-первых, давайте удостоверимся, что мы все говорим об одном и том же регулярном выражении.Вероятно, он был создан примерно так:
public static final Pattern CMD_LINE_ARGS_PATTERN =
Pattern.compile("^([^=]+)(?:(?:\\=)(.+))?$");
Двойная обратная косая черта в (\\=
) преобразуется компилятором Java в одну обратную косую черту, поэтому Pattern.compile()
видит ее как \=
, экранированныйзнак равенства.Который, кстати, не нужно избегать;^([^=]+)(?:=(.+))?$
работал бы так же хорошо.
Все вместе этот код ищет команду в одной из следующих форм:
command
command=arg
command=foo,bar
command=abc,123,xyz
... и так далее.Первая часть regex - ([^=]+)
- захватывает «команду», то есть все, что находится до первой, равно, если оно есть, или всей строке, если нет.Вторая часть становится необязательной, если ее окружить не захватывающей группой, контролируемой квантификатором ?
.Если есть знак равенства, (?:\\=)
будет его использовать, а затем (.+)
захватит остальную часть строки.
Если совпадение выполнено успешно, команда будет записана в группе № 1, но мы непока не знаю, был ли список аргументов.Если не было знака равенства, вторая группа захвата не будет участвовать в матче, и m.group(2)
вернет null
.В противном случае мы разделяем его на запятые, чтобы выделить отдельные аргументы.
Но этот код только уводит вас.Он также примет эти входные данные, но вам придется проверить их, чтобы убедиться, что они действительны:
command= foo , bar # surrounding spaces okay/will be trimmed?
command=foo bar # internal spaces okay?
command=foo, # one-item args list, no problem
command=, # zero-item args list, could be trouble