アプリ版:「スタンプのみでお礼する」機能のリリースについて

「=」で区切られている文字を以下のように分割したいのですが、
うまいやり方が分からず困っています。ご教授ください。

例.
aa=bb → aa と bb に分割
aa=bb=cc → aa と bb と cc に分割
"aa=bb"=cc → aa=bb と cc に分割

要は、囲い文字が「"」(無くても良い)、区切り文字「=」で、
囲い文字で括られた中の「=」は区切り文字とみなさない。
ということがしたいです。

A 回答 (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;
}
    • good
    • 0

>うまいやり方が分からず困っています。



うまくないやり方でいいので自分でできた事を書いてみませんか。

簡易的には次のような処理になると思いますけど。
1. 先頭から1文字ずつ調べる。
2. "であれば次にあらわれる"までスキップ
3. =であれば、そこで分割
    • good
    • 0
この回答へのお礼

お早いご回答ありがとうございます。
確かに、うまいやり方より出来ることが優先ですね・・・。
仰るとおりです。

作ってみました。結果も上手くいきました。
ご参考まで、結果とソースも記載します。

【結果(分割前 --> 分割後)】
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\"");
}
}

お礼日時:2013/04/28 12:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!