Elixir 正则表达式组和 ?-标记

Elixir regex groups and ?-mark

我正在尝试使用以下正则表达式

~r/(?<cmd>.*)(:(?<args>.*))?/

获得以下行为

"COMMAND:ARGS" => %{cmd: "COMMAND", args: "ARGS"}
"COMMAND" => %{cmd: "COMMAND", args: nil}

但我得到的只是

iex(66)> Regex.named_captures(~r/(?<cmd>.*)(:(?<args>.*))?/, "COMMAND:ARG")
%{"args" => "", "cmd" => "COMMAND:ARG"}
iex(67)> Regex.named_captures(~r/(?<cmd>.*)(:(?<args>.*))?/, "COMMAND")       
%{"args" => "", "cmd" => "COMMAND"}

我做错了什么?

See regex in use here

(?<cmd>[^:]+)(?::(?<args>.*))?
(?<cmd>[^:\n]+)(?::(?<args>.*))?   # for multiline content
  • (?<cmd>[^:\n]+) 捕获除 :\n 之外的任何字符(在第二个版本中)到名为 cmd
  • 的捕获组中
  • (?::(?<args>.*))? 可选匹配以下
    • :字面匹配
    • (?<args>.*) 将行的其余部分捕获到名为 args
    • 的捕获组中

结果:

Match 1
    Full match      0-12    `COMMAND:ARGS`
    Group `cmd`     0-7     `COMMAND`
    Group `args`    8-12    `ARGS`
Match 2
    Full match      13-20   `COMMAND`
    Group `cmd`     13-20   `COMMAND`