• ベストアンサー

splitメソッドで"で囲まれていないカンマのみで区切ることは可能でし

splitメソッドで"で囲まれていないカンマのみで区切ることは可能でしょうか。 現在質問している別の質問と関連するのですが、下記のように"で囲まれていない カンマのみを区切り文字にするような正規表現はありますでしょうか。 例)123,"abc",456,",",",,"を分解  123  "abc"  456  ","  ",," 「括弧で囲まれている」であれば「".*,.*"」などはどうだろうかと思ったのですが、 囲まれていないという表現が思いつきませんでした。 よろしければアドバイスを頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

一発でやるのは難しいでしょう。 文字列には二重引用符とカンマが混在する可能性があり、 最短一致でも最長一致でもペアの引用符を検出する手が ありません。 そこで、手順として次のようにしたら如何でしょう? (1)引用符内のカンマを別の字(非表現可能文字)にする。 (2)カンマで区切る。 (3)各要素に対し、「別の字」をカンマに変換する。 (4)各要素に対し、先頭と末尾の引用符を除去する。 (5)各要素に対し、連続する引用符を1個の引用符にする。 String t = "123,\"abc\",~"; //対象文字列 Pattern p = Pattern.compile("\"(.*?)\""); //引用符内を得る正規表現 Matcher m = p.matcher(t); //一致箇所の検索 m.reset(); //検索開始点を先頭にする String r = ""; //変換後の文字列 int z = 0; //最初の位置 while( m.find() ) {     int x = m.groupCount();     for ( int i = 0 ; i < x ; i++ ) {         String w = m.group(i); //引用符内の文字列         r += t.substring(z, m.start(i)); //直前までを合成         w = w.replaceAll(",", "\u0000"); //カンマを変換         r += w; //検索部分を繋げる         z = m.end(i); //直後の位置を記録     } } String[] a = r.split(","); //カンマで区切る for ( int i = 0 ; i < a.length ; i++ ) {     a[i] = a[i].replaceAll("\u0000", ","); //カンマに戻す     a[i] = a[i].replaceAll("^\"|\"$", ""); //先頭と末尾の"を除去     a[i] = a[i].replaceAll("\"\"", "\""); //二重引用符の処理 }

_alias_
質問者

お礼

申し訳ありません。お返事が遅れしまいました。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • splitと同じ処理

    たとえば、 String[] s = new String[10]; String str = "abc:def:ghijk:lmn" s = str.split(":"); と同じようなことをsplitを使わずに簡単に行う(定石的な)方法はないでしょうか? 正規表現ではなく文字列による区切りのみの場合を考えます。

    • ベストアンサー
    • Java
  • split() 正規表現

    正規表現で / (スラッシュ) .(ドット)にマッチ 正規表現により文字列を分割し、配列に格納する split("[/\.]" $v)としていましたが split関数が使えなくなるので、変わりの方法を考えていますが preg_split()などではうまくいきませんでした。 何か方法を教えて下さい。

    • ベストアンサー
    • PHP
  • split

    $msg = "aa,bb,cc"; という文字列から真ん中だけを取り出したいとき、 正規表現で、$2という風に取り出すのと、splitを使って my($t1,$t2,$t3) = split(/\,/$msg); として$t2で取り出すのとでは、処理の速度やメモリ使用率においてどちらが効率がいいのでしょうか? また、この場合は、$t1と$t3に無駄な代入が起こってしまいますが、これを解消する手立てはありますでしょうか?

    • ベストアンサー
    • Perl
  • phpの正規表現

    phpの正規表現で困っています。 下記のような文で括弧で囲まれた文字列だけを消したいのですが、 (ABC)あいうえお(DEF) /(.*)/で置換すると文章が全部消えてしまいます。 「あいうえお」だけを残したいのですがうまくいきません。何方か教えてください。お願いします!

    • ベストアンサー
    • PHP
  • ACCESS97のモジュールにSPLITは無いの?

    パールでカンマ区切りのテキスト(行)を下記のコーディングで分解していました パールコーディング  @pflg=split(/,/,$xx) 入力($xx) 11,22,33,44 出力 @pflg(0) → 11    @pflg(1) → 22    @pflg(2) → 33    @pflg(3) → 44 アクセスのモジュールで同様のコーディングは出来ないのでしょうか?

  • preg_matchでの コンマ について 

    phpでの正規表現で 「もしも変数$wordへ入力した文字列が Japan's という文字列に一致すれば」というスクリプトを作成しましたが、うまくいきません。 if(preg_match("/japan\'s/i",$word,$match)){ この Japan's における カンマの取り扱いを このケースではどうしたらいいかよくわかりません。 \' としてみましたが、うまくいきません。 なにかアドバイスやヒントがありましたら、よろしくお願いします。 ああでもない、こうでもないとやってみましたが、その過程で 唯一 Japan's にヒットしたのは、次のスクリプトでした。 if($word=="japan\'s") ただし、これは正規表現は使っていないわけですよね。 なにか、自分のローカル環境に問題があるのかと思い、レンタルサーバーに同じものをuploadして試して見ましたが、やはり結果は同じで、ヒットしませんでした。別のパソコンでもやってみましたが、結果は同じでした。 整理しますと、 (preg_match("/japan's/i",$word,$match) ではヒットせず、よって コンマの前に\をつけて(preg_match("/japan\'s/i",$word,$match) としましたが、これもヒットしなかったということになります。 1) (')は正規表現の特殊文字でないはずですから、そのまま使えるはずだと思いましたが、なぜかこれが使えない。 2) しかも、その前にエスケープの \ をつけても、そのエスケープ が効かないのはなぜか。 追記: 最近分かったこと。 おもしろいことに、 'j すると、hitする。でも、j' とするとヒットしない。 ということは、コンマ自体には問題ないのだろうと推測しています。でも、文字の後にコンマがつくと、preg_matchにとって特別な意味を持つ文字列に変わるのではないか。

    • ベストアンサー
    • PHP
  • vba split関数 コンマ区切り

    エクセルに不慣れなため教えていただけたら幸いです。 A3~A11・B3~B11・C3~C11列にコンマ区切りの数字があります。 列によってはコンマで区切られた数字が3つのものと4つのものが混在しています。 split関数でコンマ区切りの数字を分割してE~H列・J~M列・O~R列に表示したいと考えています。 先ほど別の質問で下記のマクロを教えていただいたのですが、 その際は、A1~A9にあるものをD~G列に表示するというものでした。 よくよく考えると、A列のみではなく、B・C列と複数の列を コンマ区切りしたいと考えています。 このような場合は、どうしたらよいでしょうか。 vba不慣れなためわかりづらかったら申し訳ありません。 お分かりになられるかたがいらっしゃいましたら教えていただけますでしょうか。 よろしくお願いいたします。 Option Explicit ' Sub Macro1()   Dim Rout As Long   Dim Colu As Integer   Dim Expression As Variant '   For Rout = 1 To Cells(Rows.Count, "A").End(xlUp).Row     Expression = Cells(Rout, "A")     Expression = Split(Expression, ",") '     For Colu = 0 To UBound(Expression)       Cells(Rout, Colu + 4) = Expression(Colu)   Next Colu, Rout End Sub

  • Perl正規表現s置換演算子の末尾にカンマについて

    お世話になります。 Perl正規表現プログラムで、 s置換演算子の末尾に、 カンマと丸カッコでスカラ変数を囲んで、 存在している箇所 たとえば、 s/あいうえお/($hensu = $&) =~ tr{ABC}{abc}, ($hensu) =~ s{123}{123}, ($hensu) /eg; のような正規表現であれば、 上記のtr置換演算子や、s置換演算子それぞれの末尾に、 「 , ($hensu) 」 として、カンマと丸カッコでスカラ変数を囲んで、 存在している箇所は、 どのような意味があるのでしょうか? 以上になります。 PS: ネット上や正規表現の本などを読んでも、 上記したような、 カンマと丸カッコでスカラ変数を囲んでいる パターンの解説を、 見つけられなかった為、 ご質問させていただきました。 ご存じの方がいらっしゃいましたら、 教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • スプリット合成について

    下記の内容で質問があります。回答をいただけると助かります。よろしくお願いします! ▼製品名(例:P-20HD・VR-4HD) V-60HD ▼質問したい箇所などがありましたら、教えてください。(例:モニター・配信関連など) スプリット合成方法について ▼困っていることや、聞いてみたいことをお書きください。 【困っていること例】:設定の仕方がわからない・接続ができなくなった) 【聞いてみたいこと例】:セッティング方法を教えほしい・使ってみた感想を聞きたい ≪※表示されている画像やスクリーンショットを添付すると伝わりやすくなります!≫ 取扱説明書に従い、スプリット合成(V-CENTER)はできましたが、両画面が均等ではなく、片側の表示が全体の2/3を占めてしまっています。 均等にする方法を教えてください。 ※OKWAVEより補足:「電子楽器メーカーローランド製品、ボス製品」についての質問です。

  • C# Splitと配列の複合方法

    こんにちは、 ”てすと、です。¥四月、寒い。” のような文字列があり これを¥で区切り、さらにカンマで区切って(Splitでここはできたのですが) 結果を下記のように配列に格納したいと思うのですが、どのように記述すればよいでしょうか? 配列(0,0)=”てすと” 配列(0,1)=”です。” 配列(1,0)=”四月” 配列(1,1)=”寒い。” 文字列の内容が定まっていないため配列の要素数が変動してするものでして。