坂野 正明と申します。

At Thu, 21 Mar 2002 11:22:25 +0900,
matz / ruby-lang.org wrote:
> In message "[ruby-list:34529] gsub! /(^|[^0-9])(?=[a-z])/"
>     on 02/03/21, "TOYOFUKU Chikanobu" <toyofuku / juice.or.jp> writes:
> |# ruby
> |x = "aa7cabc3a25baa\n"
> |x.gsub!(/(^|[^0-9])(?=[a-z])/, "\\1@")
> |print x # => @aa7c@a@b@c3a25b@a@a
> 
> 先頭のaにマッチしたあと、a7cabc3a25baa と /(^|[^0-9])(?=[a-z])/
> をマッチさせるのですが、
> 
>   ^は文字列の先頭ではないのでマッチしない
>   [^0-9]はaにマッチするが、7は[a-z]にマッチしない
> 
> のでマッチしません。Perlは^が文字列の先頭でなくてもマッチす
> るんですね。^を\Gに置換えると動作します。

…私の理解が正しければ、この御説明は、
	"7"の直前に'@'がつかない(マッチしない)理由
になっていると思います。一方、豊福さんの元の御意向は、
	(元文字列の2番目の)"a"の直前に'@'がつかない(マッチしない)のはなぜ?
ですので、問題が少し違うと思うのですが…。
# まつもとさんのおっしゃる「文字列の先頭」というのは、上の例で言う
# 「"aa7cabc3a25baa\n" の先頭」と理解してよろしいでしょうか?


元々の例が "a" が複数回出てきて誤解を招きそうなので、以下、元文字列
の x を少し変えて、
	x = "ab7cdefg"
	x.gsub!(/(^|[^0-9])(?=[a-z])/, "\\1@")
で議論させて下さい。

個人的には、

  ・第一段: "(先頭)ab7cdefg" と比較
	^ : x の先頭 (上の表記の「(先頭)」) にマッチ
	(?=[a-z]) : a にマッチ (幅なし)
		結果: 「(先頭)」 → 「(先頭)@」 と置換 ("(先頭)@ab7cdefg")

  ・第二段: "ab7cdefg" と比較
	^ : もう文字列の先頭ではないので、マッチしない
	[^0-9] : a にマッチ
	(?=[a-z]) : b にマッチ (幅なし)
		結果: a → a@ と置換 ("(先頭)@a@b7cdefg")

...以下略

となるのは自然なように思えるのですが…?


さかのまさあき