Elixir正则表达式组和?-mark

时间:2018-04-06 19:18:42

标签: regex elixir pcre

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

~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"}

我做错了什么?

1 个答案:

答案 0 :(得分:1)

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`