全角文字に挟まれた半角スペースを削除するには?

全角文字に挟まれた半角スペースを削除するには?

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/

とするとちょっとだけ短くなりますね。