From: matz@... (Yukihiro Matsumoto) Date: 1998-09-14T15:03:25+09:00 Subject: [ruby-list:9558] Re: String#gsub!() まつもと ゆきひろです In message "Re: [ruby-list:9551] Re: String#gsub!()" on 98/09/14, inaba@st.rim.or.jp writes: |rubyでは明確な記述はないのですが、1.1c4の挙動では | | % ruby -l | " a ".scan(/\b/){ print "|#$`(#$&)#$'|" } | |() a | | | ()a | | | a() | | | a ()| | % ruby -l | "a".scan(/\b/){ print "|#$`(#$&)#$'|" } | |()a| | |a()| | |と先頭と最後でかならずマッチするようです。これはバグですよね? バグというか,現時点では仕様の違いというべきでしょうね.Ruby がベースにしているemacsの正規表現では \b は, `\b' matches the empty string, but only at the beginning or end of a word. Thus, `\bfoo\b' matches any occurrence of `foo' as a separate word. `\bballs?\b' matches `ball' or `balls' as a separate word. と説明されていて,実装を見ると #define AT_WORD_BOUNDARY(d) \ (AT_STRINGS_BEG(d) || AT_STRINGS_END(d) || IS_A_LETTER(d - 1) != IS_A_LETTER(d)) つまり,文字列の先頭と末尾には無条件でマッチするようになって ます.うーむ. ということで,これは現時点での仕様ではあるもののPerlの仕様の 方が筋が通っていると思うので,修正する事にします. まつもと ゆきひろ /:|)