[ruby-list:47327] Re: 無欲マッチの使い方

From: KIMURA Koichi <kimura.koichi@...>
Date: 2010-08-20 02:56:01 UTC
List: ruby-list #47327
木村です。

On Fri, 20 Aug 2010 11:25:15 +0900
AOKI Yoshihiro <aoki@livretech.co.jp> wrote:

> 青木です。
> 
> 文字列は
> 
>   {(A_{1}-q)}^{2n}=\sum _{k=0}^{2n}_{2n}\mrm{C}_{k}
> 
> ですが,
> 
> > 始めの \{.+?\} のところで、.はどの文字にもマッチしますから続きの\\mrm の直前まで全部取ってしまう訳ですね。
> 
> 「_を伴って,{...} 内が最短の場所で\mrmに接するところ」だと _{2n} になると思ったのですが,
> そうではないのでしょうか(正規表現の冒頭には _ を入れていますので)。

意図していない結果になっていますが、正しく動作しています。
というのも、

_(\{.+?\})\\mrm\

の部分は _ で始まり、{ と } で挟まれた任意の文字列があり、それに続いて 
\mrm\ がくるということですから、
_{1}-q)}^{2n}=\\sum _{k=0}^{2n}_{2n}\\mrm
はその条件を満たしてしまいます。

「最短」というのは良く誤解されますが、マッチする全部の組み合わせの中で最短のものを
採用するのではなくて、文字列の先頭からマッチングしていって最初にマッチに成功したもの
(の中で最短)になります。


_{2n}\\mrm だけ取り出したいということであるなら、たとえばあさりさんが
すでに例に出したように } を { } に挟まれる文字から除外してやって、

_(\{[^}]+\})\\mrm\{([CHP])\}_(\{.+?\})

とでもすればよいです。

あさりさんの例ではブラケットの中が \} になっていますが、このエスケープは
不要です(あれ、今の鬼車は警告するのだっけか?)。また、その繰返しを lazy に
する必要はありません。



-- 
木村浩一


In This Thread