
A 回答 (2件)
- 最新から表示
- 回答順に表示
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;
}
No.1
- 回答日時:
>うまいやり方が分からず困っています。
うまくないやり方でいいので自分でできた事を書いてみませんか。
簡易的には次のような処理になると思いますけど。
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\"");
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルデーターの並び替え 5 2022/08/06 09:59
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- 宇宙科学・天文学・天気 反物質がほとんどなくて、ほぼ物質だけの宇宙になったのは偶然ですか? 3 2022/11/13 14:37
- 宇宙科学・天文学・天気 反物質がほとんどなくて、ほぼ物質だけの宇宙になったのは偶然ですか? 1 2022/07/04 16:02
- 洋画 「トラ・トラ・トラ!」の字幕 3 2022/10/17 01:15
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- UNIX・Linux sedでの正規化 2 2022/05/10 11:39
- 哲学 君もハードボイルドに生きてみないか 1 2022/10/12 16:47
- その他(趣味・アウトドア・車) 12V/5V DCDCコンバーターについて 4 2023/06/20 07:08
- その他(自転車) この自転車用ヘルメット、安全なヘルメットではないですか。 10 2023/04/16 07:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jdbcでinsert,delete,createをe...
-
プログラミングの問題です。大...
-
Googleログインボタンのデザイ...
-
JDONWROADER2のエラー修復
-
「main メソッドを持つクラスが...
-
Eclipse 動的プロジェクトで404...
-
正規表現について質問です。 カ...
-
スプレッドシートからリマイン...
-
googleスプレッドシートのスク...
-
googleスプレッドシートのGASに...
-
Verilogについて質問です。この...
-
論理回路設計をVerilogで行う問...
-
ゲーム開発の入門書を探しています
-
session,requestはjspで未定義...
-
サーブレットをapacheで公開す...
-
下記のリストならno002が含まれ...
-
is this even a thing?
-
JAの支部?地域の農協のカード...
-
えハミルトン路と全域木のちが...
-
CSV出力を画面から選択したデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JDONWROADER2のエラー修復
-
Googleログインボタンのデザイ...
-
配列にnullを代入すると、null...
-
jdbcでinsert,delete,createをe...
-
「main メソッドを持つクラスが...
-
プログラミングの問題です。大...
-
eclipseで作ったプログラムを他...
-
正規表現について質問です。 カ...
-
Eclipse 動的プロジェクトで404...
-
マイクラでPythonのプログラミ...
-
jdk17.06のインストーラーが起...
-
自作Androidアプリのデータ引き...
-
直し方について教えて頂きたい...
-
eclipse実行ができない
-
サーブレットをapacheで公開す...
-
あんまりお料理しないのに台所...
-
CSV出力を画面から選択したデー...
-
次のhtml・cssでspan内の文字を...
-
問題作成のWebアプリの作り方を...
-
ゲーム開発の入門書を探しています
おすすめ情報