パイプで区切られたパラメーターを受け取り、それをトークン化する必要があります。ただし、パイプは \| でエスケープできます。セパレータではなく、トークンの一部であることを示します。Java コンパイラーは、文字列リテラルに " およびエスケープされた引用符 \" がある文字列でこれを行うことを知っています。
しかし、そのような文字列をトークン化するための優れたユーティリティ関数/アルゴリズムはわかりません。出力は文字列のリストになります。
サンプル入力 1: "jk|g4"
、出力 : "jk" , "g4"
(2 つの文字列を含むリスト)
サンプル入力 2: "j\|k|g4|b"
、出力 : "j|k" , "g4", "b"
(3 つの文字列とリテラル パイプを含むリスト)
を使用してみString.indexOf("|")
ましたが、前の文字が \ ... であるかどうかを確認しましたが、エラーがあり、確認したかったのです : もっと簡単な方法はありますか? 正規表現?
これが私が持っているものです:
import java.util.ArrayList;
import java.util.List;
public class PasrePipes {
public static void main(String[] args) {
String in = "j\\|k|g4|b";
{
String[] ex = { "j|k", "g4", "b" };
tst(in, ex);
}
in = "j|k|g4|b";
{
String[] ex = { "j", "k", "g4", "b" };
tst(in, ex);
}
}
private static void tst(String in, String[] ex) {
System.out.println("----\n" + in);
List<String> toks = parse(in);
if (toks.size() != ex.length) {
System.out.println("size mismatch, got :" + toks.size() + " exp " + ex.length);
}
for (int i = 0; i < ex.length; i++) {
if (toks.size() > i) {
String n = toks.get(i);
if (!ex[i].equals(n)) {
System.out.println(" mismatch :" + i + ", got :" + n + "; exp :" + ex[i]);
} else {
System.out.println(" okay :" + i + "; exp :" + ex[i]);
}
}
}
System.out.println("--");
}
private static List<String> parse(String in) {
List<String> tokens = new ArrayList<String>();
int i = in.indexOf('|');
int old = 0;
while (i > -1) {
if (i > 0) {
if (in.charAt(i - 1) == '\\') {
i = in.indexOf('|', i + 1);
continue;
}
}
String s = in.substring(old, i);
s.replace("\\|", "|");
tokens.add(s);
old = i + 1;
i = in.indexOf('|', i + 1);
}
if(i > 0 && i < (in.length() - 1)) {
String s = in.substring(i + 1);
s.replace("\\|", "|");
tokens.add(s);
}
return tokens;
}
}