понимание этого регулярного выражения - PullRequest
0 голосов
/ 19 ноября 2011

Я пытаюсь понять, что делает следующее.

^([^=]+)(?:(?:\\=)(.+))?$

Есть идеи?

Это используется здесь. Очевидно, это синтаксический анализатор командной строки, но я пытаюсь понять синтаксис, чтобы я мог действительно запустить программу. Это из commandline-jmxclient , у них нет документов по настройке свойств JMX, но в их исходном коде есть такая опция, поэтому я просто хочу понять, как я могу вызвать этот метод.

  Matcher m = Client.CMD_LINE_ARGS_PATTERN.matcher(command);
  if ((m == null) || (!m.matches())) {
    throw new ParseException("Failed parse of " + command, 0);
  }

  this.cmd = m.group(1);
  if ((m.group(2) != null) && (m.group(2).length() > 0))
    this.args = m.group(2).split(",");
  else
    this.args = null;

Ответы [ 4 ]

5 голосов
/ 19 ноября 2011

он говорит: «любое количество символов, за которыми не стоит« = », необязательно, за которыми следует« = », за которым следует любое количество любых символов» *

, но вы действительно должны прочитать регулярных выражений

4 голосов
/ 19 ноября 2011

Ну, объяснение было бы так:

"
^           # Assert position at the beginning of the string
(           # Match the regular expression below and capture its match into backreference number 1
   [^=]        # Match any character that is NOT a “=”
      +           # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
(?:         # Match the regular expression below
   (?:         # Match the regular expression below
      =           # Match the character “=” literally
   )
   (           # Match the regular expression below and capture its match into backreference number 2
      .           # Match any single character that is not a line break character
         +           # Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   )
)?          # Between zero and one times, as many times as possible, giving back as needed (greedy)
$           # Assert position at the end of the string (or before the line break at the end of the string, if any)
"

Он будет захватывать все до = до ссылки 1 и все после нее до ссылки 2.

например

33333098320498
adhajdh =3232-40923-04924-0924

Для первой строки все записывается в $ 1.

Для второй:

adhajdh  <---------- captured to $1
3232-40923-04924-0924 <----- captured to $2
1 голос
/ 19 ноября 2011

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

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
0 голосов
/ 19 ноября 2011

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

...