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

时间:2011-09-26 06:53:08

标签: 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"]]

2 个答案:

答案 0 :(得分:8)

来自fine manual

  

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

这一个:

"aaaaaafbfbfsjjseew".scan(/(.)/)

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

下一个:

"aaaaaafbfbfsjjseew".scan(/((.))/)

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

第三个:

"aaaaaafbfbfsjjseew".scan(/((.)\2*)/)

再次包含两个组,但也包含对内部组的反向引用,因此外部组(第一组中的AKA)吞噬重复项,并获得["aaaaaa", "a"]["jj", "j"]和{{1 }}

第四个:

["ee", "e"]

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

第五个:

\1

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

答案 1 :(得分:0)

"aaaaaafbfbfsjjseew".scan(/(.)/)表示字符串可以拆分为单独的字符串数组。

这里的括号表示它是一个数组,括号中的. - 符号表示该单个数组字符串中的字符数。

如果我们为假设"hellovenkat".scan(/(...)/)而写,则会产生结果 [["hel"],["lov"],["enk"]]。它不提供最后一个索引,因为它不能包含三个字符。

如果我们提供"hello venkat".scan(/(...)/),结果如下。 答:[["hel"], ["lo "], ["ven"], ["kat"]]