teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2015/04/12 15:46

投稿

ngyuki
ngyuki

スコア4516

answer CHANGED
@@ -5,4 +5,44 @@
5
5
  ary = str.scan(/((.)\2{5,}|.)/).map{|v|v[0]}
6
6
  p ary
7
7
  # => ["0", ".", "1", "8", "8", "8", "999999999", "3", ..., "2", "E", "9"]
8
- ```
8
+ ```
9
+
10
+ ---
11
+
12
+ > N(>5)個以上連続するなら区切らず
13
+
14
+ `>5` なので、5個以上、ではなく、5個より多い(=6個以上)としています。
15
+
16
+ 次のようにバラして考えます。
17
+
18
+ ```lang-ruby
19
+ (
20
+ (.)
21
+ \2
22
+ {5,}
23
+ |
24
+ .
25
+ )
26
+ ```
27
+
28
+ `|` で区切られた前半が任意の 6 個以上連続する文字列で、後半が任意の 1 文字にマッチします。
29
+
30
+ 後半は説明するまでもないと思うので、前半だけ説明します。
31
+
32
+ `(.)`
33
+
34
+ 任意の 1 文字にマッチします。
35
+ 括弧で囲っているのでキャプチャされます。
36
+ これは 2 番目のキャプチャです。
37
+ 1 番目は全体を囲っている `( )` です。
38
+
39
+ `\2`
40
+
41
+ 2番目のキャプチャを後方参照します。
42
+ 要するに↑の `(.)` でマッチした文字です。
43
+
44
+ `{5,}`
45
+
46
+ 直前のパターンが 5 個以上連続するという意味です。
47
+ 要するに↑の `\2` が 5 個以上連続するという意味です。
48
+ なので↑↑の `(.)` が `(.)` 自身も含めて 6 個以上連続するという意味になります。