[ruby-list:50534] Re: 正規表現のキャプチャで悩む
From:
Kazuhiro NISHIYAMA <zn@...>
Date:
2017-06-04 03:33:15 UTC
List:
ruby-list #50534
西山和広です。
詳細はみていないのですが、文字クラスの理解が不十分なのではないでしょうか。
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)