From: Minero Aoki Date: 2003-03-19T16:58:55+09:00 Subject: [ruby-list:37356] Re: 正規表現の位置指定の使い方 青木峰郎です。 In mail "[ruby-list:37354] 正規表現の位置指定の使い方" AOKI Yoshihiro wrote: > あおきよしひろといいます。 > > #!ruby -Ks > p /a亜/ =~ "a亜" # => 0 > p /(?=a)亜/ =~ "a亜" # => nil > > で、両方ともマッチするのを期待していたのですが、 > 根本的に(?=...)の使い方が間違っているのでしょうか・・・。 むかし、全く同じことでハマりました。 (?=...) というのは、それが書いてある場所から後ろに働くんです。 つまり /(?=a)亜/ は、「aと亜の両方に**同時に**マッチする文字列」 にマッチします。ですから絶対にマッチしません。 たとえば /(?=[a-z])\w+/ ならば、\w の 1 文字以上の並びで、 かつその一文字目が [a-z] であるものにマッチします。つまり 以下のようになります。 /(?=[a-z])\w+/ === "word" # マッチする /(?=[a-z])\w+/ === "" # マッチしない /(?=[a-z])\w+/ === "210" # マッチしない /(?=[a-z])\w+/ === "w210" # マッチする /(?=[a-z])\w+/ === "-" # マッチしない > p /(?!a)亜/ =~ "a亜" # => 1 > > というのもなぜマッチするのかわかりません。 これは、「亜」にマッチして、**しかも**「a」にマッチしないもの、 にマッチします。ですから「亜」があれば必ずマッチします。 > 本当は > > /(?!\\[^\s!-/:-?^~_]*)[亜愛]") > > のようにして、TeXコマンドではない部分の特定の漢字を抜き出そうとして > うまくいかないので、上のようにしてみてもマッチしないので、 > 位置指定をどう使えばいいのかよく分かりませんでした。 つまり、特定のコンテキストにある文字列を探しているんですよね。 そういうときは /\\[^\s!-/:-?^~_]*([亜愛])/ === str matched = $1 として $1 を取るのがよいと思います。 ※ ちなみに 1.8 だと同じことが次のように書けます。 matched = str.slice(/\\[^\s!-/:-?^~_]*([亜愛])/, 1) ------------------------------------------------------------------- 青木峰郎