全角文字に挟まれた半角スペースを削除するには?
36618 sinara blade こんな感じでどうかな。
str.gsub!(/([^ ]) +(?=([^ ]))/) { $1.size > 1 && $2.size > 1 ? $1 : $& }
36628 sinara blade おお、なるほど。R 以外の一文字というは (?!R). と書けるというわけですね。
> p str.gsub(/(?![A-Za-z0-9_])(.) +(?![A-Za-z0-9_])(.)/, '\1\2')
おお、なるほど。R 以外の一文字というは (?!R). と書けるというわけですね。 ただ、このケースでは後半がちょっとまずくて、
str = "漢字オプシ ョ ン" p str.gsub(/(?![A-Za-z0-9_])(.) +(?![A-Za-z0-9_])(.)/, '\1\2') #=> "漢字オプショ ン"
となってしまいます。修正すると
p str.gsub(/(?![A-Za-z0-9_])(.) +(?![A-Za-z0-9_])(?=.)/, '\1')
かな。あと、このままだと半角記号も全角と同等な扱いになってしまうので、
結論としては
p str.gsub(/(?![\WA-Za-z0-9_])(.) +(?![\WA-Za-z0-9_])(?=.)/, '\1')
ですね。というわけで、まとめておくと
- 『半角』文字は [\WA-Za-z0-9_] と書ける
- 『全角』文字は (?![\WA-Za-z0-9_]). と書ける
でいいかしら。
36634 moriq.kazuhi [^\Wa-zA-Z_\d] と (?![\Wa-zA-Z_\d]). の違いは
[^\Wa-zA-Z_\d] と (?![\Wa-zA-Z_\d]). の違いは
不完全な多バイト文字の一部
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=%C0%B5%B5%AC%C9%BD%B8%BD
にマッチするかですかね。
p 'あ' p 'あ'[0,1] p 'あ' =~ /[^\Wa-zA-Z_\d]/ p 'あ'[0,1] =~ /[^\Wa-zA-Z_\d]/ p 'あ' =~ /(?=[^\Wa-zA-Z_\d])./ p 'あ'[0,1] =~ /(?=[^\Wa-zA-Z_\d])./ p 'あ' =~ /(?![\Wa-zA-Z_\d])./ p 'あ'[0,1] =~ /(?![\Wa-zA-Z_\d])./
=begin SJISの場合
$ ruby -KS mb0.rb "あ" "\202" 0 0 0 nil 0 nil
36636 nobu.nakada /(?![\Wa-zA-Z_\d])./は/(?![a-zA-Z_\d])\w/とするとちょっとだけ
/(?![\Wa-zA-Z_\d])./
は、
/(?![a-zA-Z_\d])\w/
とするとちょっとだけ短くなりますね。