[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20263] Re: /()*\1/ =~ ""

From: Tanaka Akira <akr@...17n.org>
Date: 2003-05-21 12:10:28 UTC
List: ruby-dev #20263
In article <5FD2F0CF7F5D7F44B00F36870B9E78B508DE502A@SBG-EX4>,
  kkosako@softbank.co.jp writes:

>> % ./ruby -rpp -e 'pp /(?:a|()|b)*/.match("abababab")'
>> #<MatchData "a" "">
>> 
>
> これについては、そんなに変だとは思っていません。
> 繰り返すことに対してgreedyであって、文字列を消化することにgreedyだとは
> 考えていなかったので。

ふむ。() が無限にマッチするからそれで十分に greedy だということだと思
うんですが、() が無限にマッチした後にさらに b にマッチする方がさらに
greedy なんじゃないかと思います。

> Rubyでも範囲指定の場合には、以下のようになります。
> /(?:a|()|b){0,8}/.match("abababab")[0]    #=>  "a"

それはいいんじゃないでしょうか。最大 8回マッチするなら a が 1回、() が
7回というのが妥当でしょう。

でも、可能な限り多くマッチするなら、() に無限回マッチした後さらに b の
選択肢を試すという考え方もあると思います。

まぁ、() に無限回マッチしたからそれで十分という考え方もあるわけですが。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread

Prev Next