使用RegEx扫描组

dio*_*ovk 4 regex elixir

以下代码的返回完全不是我所期望的:

iex(12)> Regex.scan(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups)
[["a"], ["a"]]
Run Code Online (Sandbox Code Playgroud)

有2组,但只有命名的组出现在结果中.并且组名完全被忽略.

如果我使用named_capture,我会得到以下内容:

iex(14)> Regex.named_captures(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups)
[groupname: "a"]
Run Code Online (Sandbox Code Playgroud)

好吧,我认为结果

Regex.scan(%r/(?<groupname>a)b(c)/g,"abcdabcd", capture: :groups)
Run Code Online (Sandbox Code Playgroud)

应该是

[["a", "c"], ["a", "c"]]    #=> including "anonymous groups"
Run Code Online (Sandbox Code Playgroud)

要么

[[groupname: "a"], [groupname: "a"]] #=> include group name in the results
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么在使用Regex.scan时我必须在组捕获中命名组才会完全忽略它们?

Jos*_*lim 5

碰巧这个名字:groups具有误导性.它不是所有组,而只是命名组.这就是为什么我们要重命名:groups,以:named在即将发布的版本.您可以通过使用获得所需的行为capture: :all_but_first.我将很快记录这个选项.

  • 默认模式是`:all`,它捕获整个匹配以及每次捕获(匿名或命名).`:all_but_first`排除整场比赛. (2认同)