为什么使用正则表达式和.scan会产生这些结果?

Rak*_*esh -1 ruby regex string

>> "aaaaaafbfbfsjjseew".scan(/(.)/)
=> [["a"], ["a"], ["a"], ["a"], ["a"], ["a"], ["f"], ["b"], ["f"], ["b"], ["f"], ["s"], ["j"], ["j"], ["s"], ["e"], ["e"], ["w"]]


>> "aaaaaafbfbfsjjseew".scan(/((.))/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]

>> "aaaaaafbfbfsjjseew".scan(/((.)\2*)/)
=> [["aaaaaa", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["jj", "j"], ["s", "s"], ["ee", "e"], ["w", "w"]]


>> "aaaaaafbfbfsjjseew".scan(/((.)\1*)/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]

>> "aaaaaafbfbfsjjseew".scan(/((.)\3*)/)
=> [["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["a", "a"], ["f", "f"], ["b", "b"], ["f", "f"], ["b", "b"], ["f", "f"], ["s", "s"], ["j", "j"], ["j", "j"], ["s", "s"], ["e", "e"], ["e", "e"], ["w", "w"]]
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 8

精细手册:

str.scan(pattern)→array
[...]
如果模式包含组,则每个单独的结果本身就是一个数组,每个组包含一个条目.

这个:

"aaaaaafbfbfsjjseew".scan(/(.)/)
Run Code Online (Sandbox Code Playgroud)

有一个组,所以你得到一个数组数组:每个单独的结果是一个单独的元素数组.

下一个:

"aaaaaafbfbfsjjseew".scan(/((.))/)
Run Code Online (Sandbox Code Playgroud)

有两组碰巧具有相同的值,因此您在各个结果数组中得到两个相同的元素.

第三个:

"aaaaaafbfbfsjjseew".scan(/((.)\2*)/)
Run Code Online (Sandbox Code Playgroud)

又包含了两个组,但是也包含了向后引用内部组,以便外组(AKA第一组)狼吞虎咽重复和你["aaaaaa", "a"],["jj", "j"]["ee", "e"].

第四个:

"aaaaaafbfbfsjjseew".scan(/((.)\1*)/)
Run Code Online (Sandbox Code Playgroud)

只是尝试将后引用切换到外部组,但未\1在组1中定义,因此它等效于/((.))/.

第五个:

"aaaaaafbfbfsjjseew".scan(/((.)\3*)/)
Run Code Online (Sandbox Code Playgroud)

试图引用一个不存在的组(当只有两个组时组3),因此它的行为与...相同/((.))/.