西山和広です。 >>> Thu, 27 Oct 2005 14:36:50 +0900 の刻に >>> cxn03651 / msj.biglobe.ne.jp(中村 英夫) 氏曰く > 全角スペースを区切り(ただし、括弧で囲まれたものは区切りと > しない)として文字列の分解を行いたいのですが、次のように行う > と"@"を含んだ文字列が切り出されてしまいます。 > > WindowsXPのコマンドプロンプトで > >ruby -v > ruby 1.8.2 (2005-02-01([i386-mswin32] > >ruby -Ks -e "p 'あい(う え)お かき'.scan(/[^ (\(]*(?:[(\(][^)\)]*[)\)])*[^ (\(]*(?:[(\(][^)\)]*[)\)])*/)" > ["あい(う え)お", "", "@かき",""] > > VineLinux3.2にWinXP上のTeraTermProからログインして > $ruby -v > ruby 1.8.2 (2004-11-03) [i386-linux] > $ruby -Ke -e "p 'あい(う え)お かき'.scan(/[^ (\(]*(?:[(\(][^)\)]*[)\)])*[^ (\(]*(?:[(\(][^)\)]*[)\)])*/)" > ["あい(う え)お", "", ",・\255", ""] > > ##上記中、半角2つ分のスペースに見える部分は、全角スペース > を入れてあります。 > > これは(やはり)私のスクリプトが悪い所為でしょうか。 全角文字に「*」(0回以上の繰り返し)を付けると マッチの開始位置がずれることがあるようです。 % cat test_ruby-list-41400.rb #!/usr/bin/ruby -Ke require 'test/unit' class KanjiCharStarMatchTest < Test::Unit::TestCase def test_not_char_star assert_equal(['', '', ''], 'aa'.scan(/[^a]*/)) assert_equal(['', '', ''], 'ああ'.scan(/[^あ]*/)) end def test_char_star assert_equal(['a', '', '', ''], 'abc'.scan(/a*/)) assert_equal(['あ', '', '', ''], 'あいう'.scan(/あ*/)) end end % ruby test_ruby-list-41400.rb Loaded suite test_ruby-list-41400 Started FF Finished in 0.041146 seconds. 1) Failure: test_char_star(KanjiCharStarMatchTest) [test_ruby-list-41400.rb:13]: <["あ", "", "", ""]> expected but was <["あ", "", "", "", "", ""]>. 2) Failure: test_not_char_star(KanjiCharStarMatchTest) [test_ruby-list-41400.rb:8]: <["", "", ""]> expected but was <["", "△\242", ""]>. 2 tests, 4 assertions, 2 failures, 0 errors % -- |ZnZ(ゼット エヌ ゼット) |西山和広(Kazuhiro NISHIYAMA)