在 ruby​​ 中,这个正则表达式有什么作用? /((\w)\2*)/

In ruby, what does this regex do? /((\w)\2*)/

"aaabbcde".scan(/((\w)*)/)

这行代码会得到如下结果

[["aaa", "a"], ["bb", "b"], ["c", "c"], ["d", "d"], ["e", "e"]]

我不明白的部分是*的作用。为什么这会生成一个二维数组?

已编辑:

只是在获得帮助和进行一些研究后根据我的理解得出的总结。希望这会帮助任何搜索类似主题的人。

您可以使用正则表达式创建捕获组。后一组可以参考前一组。 每个括号都是一个捕获组。因此,如果您这样做 /(\w)/,您将创建 1 个组,它会提取所有单词字符,并将每个单个字符放入一个单独的组中。

所以你会得到这样的字符串 "rubyy"

Match 1
1.  r
Match 2
1.  u
Match 3
1.  b
Match 4
1.  y
Match 5
1.  y

要创建第二个捕获组,您只需添加另一对括号,例如 /((\w))/。但是注意,外面一对括号是第一组,里面一对是第二组。这可以来来回回。

给定相同的字符串 "rubyy",这将有这样的结果。

Match 1
1.  r
2.  r
Match 2
1.  u
2.  u
Match 3
1.  b
2.  b
Match 4
1.  y
2.  y
Match 5
1.  y
2.  y

您可以尝试将正则表达式更改为 /(()\w)/,或 /(\w)()/,看看会发生什么(还记得我刚刚说过内括号对是第二组吗?)。 http://www.rubular.com 是在 ruby.

中试验正则表达式的好地方

指向另一个捕获组的指针: 所以我最初问的正则表达式,/((\w)*)/ 这部分只是意味着“给我你从第 2 组得到的东西(里面的那个是第 2 组),然后把它放在第 1 组中(外面的那个, 在哪里)。然后 * 只是一个常规的正则表达式,表示零个或多个。在这种情况下,#2 提取的组中的零个或多个。

有了上面的理解,你可以尝试这样做/(\w)(*)/。这也会达到类似的效果。但是您应该尝试一下差异。请记住,/(*)(\w)/ 不起作用,因为我猜 ruby 在这种类型的并行结构中按顺序运行,所以 指向一个尚不存在的捕获组。

您有两个捕获组,第一个 ((\w)*),是从左到右解析时遇到的第一个,第二个是 (\w)* 匹配捕获组 #2 的结果,零次或多次。

对于"aaa",内部捕获组(#2)匹配第一个"a",然后*变成a*,匹配接下来的两个[=17] =]的。因此,第一个捕获组匹配 'aaa'.

请注意,捕获组 #2 始终只匹配一个字符。

考虑以下因素

  • // 中的任何内容都是要匹配的正则表达式模式
  • </code> 是一个变量(称为反向引用),指向第二组括号中匹配的任何内容,在本例中为 <code>\w。如果它在另一个括号中匹配,你会使用 </code>;这些未转义的括号称为捕获组</li> <li><code>* 是 0 个或多个匹配项

要获得更好的解释,请参阅有关正则表达式的大量指南。例如:http://www.regular-expressions.info/refcapture.html