理解这个正则表达式

时间:2011-11-19 01:40:24

标签: java regex jmx

我试图理解以下内容。

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

有什么想法吗?

这是在这里使用的。显然它是命令行解析器,但我试图理解语法,所以我可以实际运行该程序。这来自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 个答案:

答案 0 :(得分:5)

它说“任意数量的字符不是'=',可选地后跟'='后跟任意数字的任何字符”

但你真的应该阅读regular expressions

答案 1 :(得分:4)

那么解释就是这样:

"
^           # 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之后捕获所有内容。

e.g。

33333098320498
adhajdh =3232-40923-04924-0924

对于第一个字符串,一切都被捕获到$ 1。

对于第二个:

adhajdh  <---------- captured to $1
3232-40923-04924-0924 <----- captured to $2

答案 2 :(得分:1)

首先,让我们确保我们都谈论相同的正则表达式。它可能是这样创建的:

public static final Pattern CMD_LINE_ARGS_PATTERN =
    Pattern.compile("^([^=]+)(?:(?:\\=)(.+))?$");

Java编译器将(\\=)中的双反斜杠转换为单个反斜杠,因此Pattern.compile()将其视为\=,转义为等号。顺便说一句,这不需要逃脱; ^([^=]+)(?:=(.+))?$也会起作用。

总之,该代码正在寻找以下其中一种形式的命令:

command
command=arg
command=foo,bar
command=abc,123,xyz

......等等。第一部分正则表达式 - ([^=]+) - 捕获“命令”,即如果有的话,第一个等于之前的所有内容,如果没有,则为整个字符串。第二部分通过用?量词控制的非捕获组围绕它而成为可选的。如果有等号(?:\\=)将消耗它,然后(.+)将捕获字符串的其余部分。

如果匹配成功,该命令将在组#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

答案 3 :(得分:0)

看一下这个regex reference,它会告诉你不同角色的所作所为。