西山和広です。

詳細はみていないのですが、文字クラスの理解が不十分なのではないでしょうか。

On Sun, 04 Jun 2017 11:11:37 +0900,
俊(とし) wrote:

> /\A((\w)\2+)([[^\2]&&\w].*)\Z/

[^\2] は "\0x02" 以外の文字という意味なので
[[^\2]&&\w] は \w と同じ意味になると思います。

> p /\A((\w)\k<2>+)([[^\k<2>]&&\w].*)\Z/.match("aaa bcd")
>     #=> #<MatchData "aaa bcd" 1:"aa" 2:"a" 3:"a bcd">

[^\k<2>]&&\w] も文字クラスの中では \なんとか の意味が変わり
(たとえば \b)、 \k は特に意味がないため (こういう並びは
将来挙動が変わる可能性があるので使わない方が良い)、
単純に k だけ書いたのと同じ意味になり、
\w に [<>] は含まれないので整理して、
最終的に [[^k2]&&\w] と同じ意味になると思います。

% irb -r irb/completion --simple-prompt
>> /\A[\2]\z/ =~ "\x02"
=> 0
>> /\A[^\2]\z/ =~ "\x02"
=> nil
>> /\A[^\2]\z/ =~ "a"
=> 0
>> /\A[\k<2>]\z/ =~ "k"
=> 0
>> /\A[^\k<2>]\z/ =~ "k"
=> nil
>> /\A[^\k<2>]\z/ =~ "2"
=> nil

普段文字列全体にマッチしたいときは \Z は使わずに \z を
使っているので、 \Z も気になったのですが、末尾に改行が
あっても良いけど、.* でキャプチャする内容にはいらない
という意図であっているのでしょうか。


-- 
|ZnZ(ゼット エヌ ゼット)
|西山和広(Kazuhiro NISHIYAMA)