我有一个字符串"wwwggfffw",并希望将其分解为一个数组,如下所示:
["www", "gg", "fff", "w"]
Run Code Online (Sandbox Code Playgroud)
有没有办法用正则表达式做到这一点?
"wwwggfffw".scan(/((.)\2*)/).map(&:first)
Run Code Online (Sandbox Code Playgroud)
scan有点好笑,因为它会返回匹配或子组,具体取决于是否有子组; 我们需要使用子组来确保重复相同的字符((.)\1),但如果它返回整个匹配而不仅仅是重复的字母,我们更喜欢它.所以我们需要将整个匹配组成一个子组,以便捕获它,最后我们需要提取匹配(没有其他子组),我们这样做.map(&:first).
编辑解释正则表达式((.)\2*)本身:
( start group #1, consisting of
( start group #2, consisting of
. any one character
) and nothing else
\2 followed by the content of the group #2
* repeated any number of times (including zero)
) and nothing else.
Run Code Online (Sandbox Code Playgroud)
所以wwwggfffw,(.)抓住w第2组; 然后\2*捕获任何额外的数量w.这使得组#1捕获www.