西山和広さん,

コメントありがとうございます.確かに文字クラスの中では私の記法は意図したようには動かない気がします.とすると,文字クラスの中に後方参照を入れ込むことはそもそもできないのでしょうか?

それから \Z の使い方ですが,私が出した例では \z のほうが適切と思いますが,一般的に
IO からの入力では末尾に改行が入ったままになっていることもあるので,安全策として \Z にしているという程度の意味です.

2017年6月4日 12:33 Kazuhiro NISHIYAMA <zn / mbf.nifty.com>:

> 西山和広です。
>
> 詳細はみていないのですが、文字クラスの理解が不十分なのではないでしょうか。
>
> 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)
>



-- 
俊(とし)
* 望湖庵日記 http://griffin.cocolog-nifty.com/lakesidedairy/