- 締切済み
[Java]文字列分割
「=」で区切られている文字を以下のように分割したいのですが、 うまいやり方が分からず困っています。ご教授ください。 例. aa=bb → aa と bb に分割 aa=bb=cc → aa と bb と cc に分割 "aa=bb"=cc → aa=bb と cc に分割 要は、囲い文字が「"」(無くても良い)、区切り文字「=」で、 囲い文字で括られた中の「=」は区切り文字とみなさない。 ということがしたいです。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Ogre7077
- ベストアンサー率65% (170/258)
この手の処理なら 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% (1626/5665)
>うまいやり方が分からず困っています。 うまくないやり方でいいので自分でできた事を書いてみませんか。 簡易的には次のような処理になると思いますけど。 1. 先頭から1文字ずつ調べる。 2. "であれば次にあらわれる"までスキップ 3. =であれば、そこで分割
お礼
お早いご回答ありがとうございます。 確かに、うまいやり方より出来ることが優先ですね・・・。 仰るとおりです。 作ってみました。結果も上手くいきました。 ご参考まで、結果とソースも記載します。 【結果(分割前 --> 分割後)】 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\""); } }