[#31191] クラスメソッドについて — cyross@...

みなさん、初めまして。

16 messages 2001/09/02
[#31192] Re: クラスメソッドについて — matz@... (Yukihiro Matsumoto) 2001/09/02

まつもと ゆきひろです

[#31196] ありがとうございます( Re: Re: クラスメソッドについて) — cyross@... 2001/09/03

サイロスです。

[#31234] oracle: sub query — Yasushi Shoji <yashi@...>

やすしです。

16 messages 2001/09/04
[#31241] Re: oracle: sub query — Yasushi Shoji <yashi@...> 2001/09/05

At Tue, 4 Sep 2001 19:59:11 +0900,

[#31238] 半角から全角へ変換 — 吉川 正晃 <yosikawa@...>

吉川と申します。こちらには初めての投稿になります。

33 messages 2001/09/05
[#31240] Re: 半角から全角へ変換 — WATANABE Hirofumi <eban@...> 2001/09/05

わたなべです。

[#31244] jcode + String#tr は? — Take_tk <ggb03124@...> 2001/09/05

たけ(tk)です。

[#31245] Re: jcode + String#tr は? — WATANABE Hirofumi <eban@...> 2001/09/05

わたなべです。

[#31280] 掲示板の再読み込み時の問題 — みかみまさと <kofu@...>

こんにちは。いつもお世話になっています、みかみと申します。

13 messages 2001/09/06

[#31283] ruby 1.6.5 preview1 — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです

17 messages 2001/09/06

[#31377] 添付ライブラリのリファレンス (HTML) — "Sadayuki Sakamoto" <flea@...8.dion.ne.jp>

酒本と申します。

20 messages 2001/09/11

[#31414] ruby 1.6.5 preview — m_seki@...

18 messages 2001/09/14

[#31419] Hash#+ ハッシュの足し算はいかが? — Take_tk <ggb03124@...>

class Hash

12 messages 2001/09/14

[#31508] 全角を半角に変換 — yoshikazu tsubaki <y-tsubaki@...>

#2回目の人ごめんなさい(間違えて2つのMLに送信してしまいました)

14 messages 2001/09/17

[#31626] my LC2001 summary — Minero Aoki <aamine@...>

あおき@結局三日連続で飲んでしまった です。

117 messages 2001/09/28
[#31642] Re: my LC2001 summary — Masaki Suketa <masaki.suketa@...> 2001/09/29

助田です。

[#31663] Re: my LC2001 summary — nobu.nakada@... 2001/09/30

なかだです。

[#31665] Re: my LC2001 summary — TAKAHASHI Masayoshi <maki@...> 2001/09/30

高橋征義です。

[#31672] Re: my LC2001 summary — matz@... (Yukihiro Matsumoto) 2001/10/01

まつもと ゆきひろです

[#31697] RUG (Re: my LC2001 summary) — TAKAHASHI Masayoshi <maki@...> 2001/10/02

高橋征義です。

[#31699] URUG (Re: RUG) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/02

もりきゅうです。

[#31688] bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/01

もりきゅうです。

[#31692] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/01

こんにちは、なかむら(う)です。

[#31779] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/05

もりきゅうです。

[#31782] Re: bcc (Re: my LC2001 summary) — "T.Kitahara" <tko-k@...> 2001/10/05

はじめまして、Kita といいます。

[#31785] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/06

もりきゅうです。

[#31805] Re: bcc (Re: my LC2001 summary) — nobu.nakada@... 2001/10/09

なかだです。

[#31806] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/09

こんにちは、なかむら(う)です。

[#31808] Re: bcc (Re: my LC2001 summary) — nobu.nakada@... 2001/10/09

なかだです。

[#31809] Re: bcc (Re: my LC2001 summary) — "U.Nakamura" <usa@...> 2001/10/09

こんにちは、なかむら(う)です。

[#31814] Re: bcc (Re: my LC2001 summary) — Kazuhiro Yoshida <moriq.kazuhiro@...> 2001/10/09

もりきゅうです。

[ruby-list:31599] Re: sub の動作

From: TAKAHASHI Masayoshi <maki@...>
Date: 2001-09-25 09:11:33 UTC
List: ruby-list #31599
高橋征義です。

Shigeo OHUE <rs232c@hte.highway.ne.jp>さん:
> >:文字列から正規表現で引っ掛けて「\&」に置換したいんですがうまく
> >:できません。たとえば下のようになっちゃいます。
(略)
> 何でそうなるかはまだわかりませんが、これから勉強します。

んでは、「何でそうなるか」について、解説してみます。
# 間違いがあったらご指摘ください(_o_)

要点は3つあります。

a) 「\」という文字は、「""」の中でも「''」の中でも特別な意味を
   持ちます。

     要するに「\」はエスケープ文字なので、自分自身をエスケープ
     することができなければなりません。
     「"\\"」「'\\'」という文字列リテラルは、「\」という文字列に
     なります。


b) 「''」の中で、「\」の後ろに「\」か「'」以外の文字が来たときは、
   「\」+その文字、になります。

     つまり、「'\$'」は「\$」という文字列に、「'\a'」は「\a」という
     文字列になります。
     ここで気をつけた方がいいのは、「'\\$'」と「'\$'」が同じに「\$」に
     なってしまう、ということです。「'\\$'」では「\」がエスケープされ
     ているわけですね。
     「\\$」という文字列が欲しい場合は、「'\\\$'」または「'\\\\$'」と
     書かなければなりません。
     # どちらかというと、「'\\\\$'」と「\」を4つ書くのがいいような
     # 気がしますが、どうなんでしょうね。

c) 「\&」という文字列は、subの第2引数の中では、「マッチした文字列と
   同じ文字列」の意味になります。これを避けたい場合、つまり「\&」と
   いう文字列そのものに置換した場合は「\\&」という文字列を使う必要が
   あります(「"\\&"」でも「'\\&'」でないのに注意!)。

     #!/usr/bin/env ruby
     replace_str = '\\&'
     p "012abc".sub(/a/, replace_str + replace_str)  #=> "012aabc"

     「マッチした文字列」というのは「a」なので、replace_str + replace_str
     は「a」+「a」、つまり「aa」になります。


これを踏まえた上で、実際の置換例を見てみましょう。


| irb(main):001:0> "a".sub(/a/, '\$')
| "\\$"

これは、/a/にマッチする最初の文字列を「\$」という文字列に置換する
ことになりますが、「\$」には特殊な意味はないので、そのまま「\$」に
なります。これを「""」で括られた文字列リテラルの形で表示すると、
「"\\$"」になります。

| irb(main):002:0> "a".sub(/a/, '\&')
| "a"

これも、/a/にマッチする最初の文字列を「\&」という文字列に置換する
ことになります。ところが、「\&」は「マッチした文字列と同じ文字列」と
いう意味になるので、マッチした文字列、つまり「a」で置換することに
なります。
ということは、「a」を「a」で置換するので、結果もやはり「a」になります。

| irb(main):003:0> "a".sub(/a/, '\\\\&')
| "\\&"

「'\\\\&'」は、「\」のエスケープが2回行われている、ということで、
「\」+「\」+「&」、つまり「\\&」という文字列になります。これで、
ようやく/a/を「\&」に置換できることになります。


……判りましたか?  やっぱり判りにくいですよね?(^^;;
というわけで、私としても、ブロックを使うことをお勧めします。

# 長々と書いて結論がコレかい!……というのは言わない約束です(汗

高橋征義 (TAKAHASHI Masayoshi)       Email:maki@inac.co.jp

In This Thread