• 締切済み

[Java]文字列分割

「=」で区切られている文字を以下のように分割したいのですが、 うまいやり方が分からず困っています。ご教授ください。 例. aa=bb → aa と bb に分割 aa=bb=cc → aa と bb と cc に分割 "aa=bb"=cc → aa=bb と cc に分割 要は、囲い文字が「"」(無くても良い)、区切り文字「=」で、 囲い文字で括られた中の「=」は区切り文字とみなさない。 ということがしたいです。

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

この手の処理なら Java 標準ライブラリの字句解析機能を活用しては如何でしょうか。 なにぶん JDK 1.0 の頃から有る古い設計なので、洗練されていないのが欠点ではありますが。 List<String> parse(String source) { int quote = '"'; int sepa = '='; // 字句解析のルール定義 StreamTokenizer s = new StreamTokenizer(new StringReader(source)); s.resetSyntax(); // 初期設定のルールを削除 s.wordChars(0x20,0x7e); // 全ての文字を 単語構成要素 とする s.quoteChar(quote); // ただし quote は文字列の引用符(エスケープ処理付き) s.ordinaryChar(sepa); // ただし sepa は単一文字 int eof = StreamTokenizer.TT_EOF; int word = StreamTokenizer.TT_WORD; List result = new ArrayList<String>(); while(true){ int token = s.nextToken(); if (token == eof) break; if (token == word || token == quote) result.add(s.sval); } return result; }

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>うまいやり方が分からず困っています。 うまくないやり方でいいので自分でできた事を書いてみませんか。 簡易的には次のような処理になると思いますけど。 1. 先頭から1文字ずつ調べる。 2. "であれば次にあらわれる"までスキップ 3. =であれば、そこで分割

sh-yuu
質問者

お礼

お早いご回答ありがとうございます。 確かに、うまいやり方より出来ることが優先ですね・・・。 仰るとおりです。 作ってみました。結果も上手くいきました。 ご参考まで、結果とソースも記載します。 【結果(分割前 --> 分割後)】 aa=bb-->[aa][bb] aa=bb=cc-->[aa][bb][cc] "aa=bb"="cc"-->[aa=bb][cc] "aa=bb"=cc-->[aa=bb][cc] "aa\"=bb"=cc-->[aa"=bb][cc] "aa=bb"=\"cc\"="dd=e\\e"-->[aa=bb]["cc"][dd=e\e] 【ソース】 import java.util.LinkedList; import java.util.List; public class Test { /** * 文字列を分割する. * @param target 分割対象文字列 * @param colsep 区切り文字 * @param surround 囲い文字 * @param escape 囲い文字のエスケープ文字 * @return 分割結果 */ private static String[] split(String target, char colsep, char surround, char escape){ List<String> list = new LinkedList<>(); StringBuilder stb = new StringBuilder(); boolean skipFlag = false; boolean escapeFlag = false; for(char ch : target.toCharArray()){ if((ch == colsep) && !skipFlag) { list.add(stb.toString()); stb = new StringBuilder(); } else if(escapeFlag){ stb.append(ch); escapeFlag = false; } else if(ch == surround){ skipFlag = !skipFlag; } else if((ch == escape) && (!escapeFlag)){ escapeFlag = true; } else { stb.append(ch); } } list.add(stb.toString()); return list.toArray(new String[0]); } /** * 分割結果表示 */ private static void test(String testStr){ StringBuilder stb = new StringBuilder(); stb.append(testStr).append("-->"); for(String str : split(testStr, '=', '"', '\\')){ stb.append("[").append(str).append("]"); } System.out.println(stb.toString()); } /** * 一括テスト */ public static void main(String[] args){ test("aa=bb"); test("aa=bb=cc"); test("\"aa=bb\"=\"cc\""); test("\"aa=bb\"=cc"); test("\"aa\\\"=bb\"=cc"); test("\"aa=bb\"=\\\"cc\\\"=\"dd=e\\\\e\""); } }

関連するQ&A

  • 文字列の分割

    以下のような文字列を分割して、それぞれ配列に格納したいのです。 strText = "aabbccddeeff"; これを、strBuf[0] = "aa";     strBuf[1] = "bb";     strBuf[2] = "cc";     strBuf[3] = "dd";     strBuf[4] = "ee";     strBuf[5] = "ff"; という具合にしたいのですが、スマートにできる 方法はないでしょうか。 よろしくお願いいたします。m(__)m

  • 配列内の文字列検索をしたい

    お世話になっております、またjavascriptで詰まってしました。現在作ってるソースは以下のイメージです。 var temp= hensuu; var list = "aa,bb,cc"; //tempがaa,bb,ccの文字を含んでいたら処理 if(list.indexOf(temp)!=-1){ //ここで何番目の要素か知りたい } という処理をしているのですがif(list.indexOf(temp)!=-1)の中で「文字列(list)に存在する」だけでなく,「区切りの何番目の要素か」も知りたいんですがそういう便利な関数か方法はあるでしょうか? list.indexOf(temp)の返す値は「文字列が見つかった場所」なのでリストの順番ではないんですよね…。 for文でひとつひとつ回すしか方法は無いのでしょうか??LIST(もしくは配列)内検索関数みたいなのがあればナイスなんですが…。分かる方、ご教授頂けたらこれ幸いです。

  • エクセルファイルのセル値に特定文字列を追加して別ファイルに

    VB2008でのプログラム方法についての相談です。以下の手順を実現したいです。 (1)エクセルファイルのあるセル中にあるデータを取得 例)A1セルの値"AA"、A2セルの値"BB"、A3セルの値"CC"..... (2)決まりきった特定文字列と(1)の値を結合 例)くっつけたい文字列 " "+AA ⇒ くっつけたい文字列"AA" くっつけたい文字列 " "+BB ⇒ くっつけたい文字列"BB" くっつけたい文字列 " "+CC ⇒ くっつけたい文字列"CC" (3)テキストファイルを生成 ○○○.txt 例) くっつけたい文字列"AA" くっつけたい文字列"BB" くっつけたい文字列"CC"

  • 文字列を分割するクラスについて

    住所のメソッドでの開発についてご質問がございます。 仕様 住所の配列は全角80(半角160)に格納される。 住所地名の途中で分割しないようにする。 80桁すべてに文字は格納されているときは20桁の4等分にする。 スペースで分割をおこなうようにする。 例1  実行前  札幌市 ○区 北○○○○○ 00-0-0-00      実行後  札幌市 ○区 北○○○○○,00-0-0-00,,      例1の場合20桁ずつ分割を考えると14桁目のスペースを利用してカンマ区切りで4つに分割 例2 実行後  あああああ いいいいい ううううう ええ     実行後  あああああ いいいいい ううううう ええ,,,     例2の場合文字がちょうど20桁なのでちょうどカンマ区切りで4等分  例3  実行前   あああああ いいいい ううううううううううう えええええ 0-00-000       実行後   あああああ いいいい,ううううううううううう えええええ,0-00-000,      例3の場合20文字だと区切りだと、うの領域の途中になるため      11桁目のスペースを利用して分割      そしてそこから20桁目を区切ろうとして次の区切りたい場所が      番地の途中になるため実行後のように、えで区切り4等分にカンマ区切り と基本的に住所分割をスペースを利用して住所の途中や番地の途中で 区切らないでカンマ区切りの4等分にするアルゴリズムを考えています。 private void 住所漢字(String 住所漢字, String 住所カナ, String 住民票住所漢字,PrintWriter out) { //(1)分割する文字列を生成 String str = new String(住所漢字); //(2)文字列をsplitメソッドで分割 String[] strAry = str.split(",", 0); { str = 住所漢字; } for (int i=0; i<strAry.length; i++) { } out.print(str.substring(0,20)+","+ str.substring(20,40) +","+ str.substring(40,60)+","+ str.substring(60,80)); }      現在は単純に全角80桁の配列に対して 20桁ずつの4等分に実行されるだけのプログラムになってます。 上記の例のような住所分割のアルゴリズムを開発する際 StringTokenizer st = new StringTokenizerのクラスは開発に有効でしょうか? また有効である場合のソース実行例の等のアドバイス、もしくは ほかに文字を分割するための便利なクラスがございましたら ご教授ください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • Excel マクロ VBA セル内で改行された文字列の分割

    はじめまして。 ExcelのVBA初心者で、ちょっと困っています。 (例) (1) セルA1に以下のような改行された文字列が入力されています。 【セルA1】 a aa aaa b bb bbb (2) セルA1内の文字列を3行毎に分割し、セルA2以降に表示させたい。 【セルA2】 a aa aaa 【セルA3】 b bb bbb ※ 今回の例ではセルA1に6行しかありませんが、実際に行数は決まっていません。 そこで以下のようなVBAを見よう見まねで作り、1行毎の分割はうまくいったのですが、『3行毎に分割』ができません。 Sub 分割() Dim A, B, C A = Split(Range("A1"), Chr(10)) B = 0 For Each C In A B = B + 1 Range("A2").Offset(B - 1, 0).Value = C Next End Sub ご教授いただけると助かります。 よろしくお願い致します。

  • C# 文字列の分割

    VS2005を使用しているものです。 複数のURL(入力)を格納したString型の配列があるのですが、 この配列から各要素(URL)の最後尾にあるファイル名だけを 取り出して別のString型の配列に入れたいのですが Splitなどを駆使すればよいのでしょうか? 例 C:\○○○\▲▲▲\××.拡張子 (元の配列の要素の一例)   などから××.拡張子の文字列だけを取り出して   別の配列に格納する感じです。 splitを使う際は\などを区切りに考えています。 for文の中でsplitを駆使しようと考えたのですが、分割した文字列を別で配列に格納して、その最後尾の要素だけ取り出したいのですが、URLの長さは入力によってまちまちなのでどのようにして取り出せばよいか困っています。 勉強不足で恐れ入りますが、何かご教授願えれば幸いです。

  • C++のstring型文字列を分割して配列に入れる

    string str = "AABBCCDD"; これを以下のように分割する方法が知りたいです。 result[0] = "AA"; result[1] = "BB"; result[2] = "CC"; result[3] = "DD"; 分割する固定長2と、結果を保存するstring型のresultを与えれば 以下のようになる関数を作りたいのですが、 C++の標準機能でスマートにできる方法がベストです。 Perlでいうunpack見たいなものです。 use strict; my $str = "AABBCCDD"; my @result = unpack '(a2)*', $str; // こんなことをC++でしたい foreach my $val (@result) { print $val, "\n"; } よろしくお願いします。

  • SQLで条件の文字列を含んでいるデータを取得する方法

    SQLにて指定した文字列を含むデータを取得する方法を探しています。 例 テーブル Test 番号   条件 __________ 01    AA 02    BB 03    AA,CC 上記のように、番号と条件という2つのフィールドを持っているテーブルをTestとします。 (1)条件にAAと指定すると、番号01と03が取得。 (2)条件にBBと指定すると、番号02が取得。 (3)条件にAAAと指定すると、一致条件なし。 (1)~(3)のような条件を満たすSQLの構文はありませんでしょうか? ご教授お願いいたします。

  • エクセルで複数列を二列にまとめる

    エクセルのデータ成形に、知恵を貸していただけますでしょうか・・・ エクセルで以下のようなデータがあります(例では8行8列) コードは本当はランダムです。 #と右下の部分は空白セルです。横には数字、コード、数字、コードの並びで、数字は一行目のみです。 1 aa-1 2 bb-1 3 cc-1 4 dd-1 # aa-2 # bb-2 # cc-2 # dd-2 # aa-3 # bb-3 # cc-3 # aa-4 # bb-4 # aa-5 # bb-5 # aa-6 # aa-7 # aa-8 これらを 1 aa-1 1 aa-2 1 aa-3 . . 2 bb-1 2 bb-2 . . 4 dd-2 というように 1. 複数の列を2列ずつのグループで2列にまとめ 2. それぞれのグループごとに各コードの左のセルにグループの数字をつけたい   (どのコード(aa-1など)がどの数字グループなのか分かるように) と思っています。 なにかいい方法はありますでしょうか。 調べてはみたのですが、 複数列を一列ではなく、二列ずつまとめていることや、 各列の長さが一様ではないことなどから 各所で紹介されている方法が適用できないでおります。 VBAもほとんど使ったことがないので、それらを応用できません。 どうぞ知恵を貸していただけたらと思います。 よろしくお願い致します。

  • VBAでCSVファイルを分割したい

    VBAを利用して、あるCSVファイルを一定のレコード数ごとに新しいファイルにファイル分割したいです。 やりたいことは、以下のようなイメージです。 関連サイトなどを参考に自分なりに取り組んでみましたが、なかなかうまくいきません。 VBAでなくても実現できそうですが、ここまでやったので勉強のためにもVBAでやりたいです。 サンプルコードなど教えていただけるとうれしいです。 ヒントでも結構ですので、よろしくおねがいします。 (2レコードずつ分割する例) sample.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 aaa@aa.aa,123,あいうえ,111-111 bbb@bb.bb,456,かきくけ,222-222 ccc@cc.cc,789,さしすせ,333-333 ddd@dd.dd,012,たちつて,444-444 eee@ee.ee,345,なにぬね,555-555 fff@ff.ff,678,たちつて,666-666 ↓↓↓ ☆sample_1.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4   →各ファイルにヘッダも入れたいです。 aaa@aa.aa,123,あいうえ,111-111 bbb@bb.bb,456,かきくけ,222-222 ☆sample_2.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 ccc@cc.cc,789,さしすせ,333-333 ddd@dd.dd,012,たちつて,444-444 ☆sample_3.csv ヘッダ1,ヘッダ2,ヘッダ3,ヘッダ4 eee@ee.ee,345,なにぬね,555-555 fff@ff.ff,678,たちつて,666-666

専門家に質問してみよう