区切り文字を含む StringTokenzier の GWT 互換の代替品を探しています。文法は文脈自由ではないため、このタスクは正規表現では解決できません。
例: ジェネリック型定義の最初のレベルを抽出します。の場合List<String>, Map<Integer, Map<Character, Boolean>>, Set<List<Double>>
、3 つのアイテムを含むリストが必要です。List<String>
そしてMap<Integer, Map<Character, Boolean>>
そしてSet<List<Double>>
サンプルコードを取り除いたもの:
private static List<String> extractFirstLevel(String type) {
List<String> res = new LinkedList<String>();
StringTokenizer st = new StringTokenizer(type, "<>,", true);
int nesting = 0; // we are only interested in nesting 0
String lastToken = "";
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (token.equals("<")) {
nesting++; // ignore till matching >, but keep track of additional <
lastToken = lastToken + "<";
} else if (token.equals(">")) {
nesting--; // up one level
lastToken = lastToken + ">";
} else if (token.equals(",")) {
if (nesting == 0) { // we are interested in the top level
res.add(lastToken);
lastToken = "";
} else { // this is a , inside a < >, so we are not interested
lastToken = lastToken + ", ";
}
} else {
lastToken = lastToken + token.trim();
}
}
res.add(lastToken);
return res;
}