更新嵌套的括號支持
既然你也需要支持嵌套方括號和逗號應在方括號內被忽略,你需要一個簡單的解析器來收集文字的你所需要的塊。
public static List<String> splitWithCommaOutsideBrackets(String input) {
int BracketCount = 0;
int start = 0;
List<String> result = new ArrayList<>();
for(int i=0; i<input.length(); i++) {
switch(input.charAt(i)) {
case ',':
if(BracketCount == 0) {
result.add(input.substring(start, i).trim());// Trims the item!
start = i+1;
}
break;
case '[':
BracketCount++;
break;
case ']':
BracketCount--;
if(BracketCount < 0)
return result; // The BracketCount shows the [ and ] number is unbalanced
break;
}
}
if (BracketCount > 0)
return result; // Missing closing ]
result.add(input.substring(start).trim()); // Trims the item!
return result;
}
並以此
輸出sample Java code的:
ex1
[ex2 , ex3 ]
[ hh3 , rt5 , w3 [ bn7 ] ]
ex 4
ex 4
[ex , ex ]
注意修剪項目是沒有必要的。
此外,我在哪裏我return result
,您可能想要添加代碼拋出異常,而不是返回result
那樣的時刻。
原來的答覆
在Java字符類,]
和[
必須進行轉義,不像在JavaScript中,你只需要逃避]
符號(字符類中)。
String pat = ",(?![^\\[]*])";
^^
這裏是一個IDEONE demo:
String s = "ex1 , [ex2 , ex3 ] , ex 4 , ex 4, [ex , ex ]";
String pat = ",(?![^\\[]*])";
String[] result = s.split(pat);
System.out.println(Arrays.toString(result));
注意,無論是在Java中,也不在JS的]
,角色職業外,沒有進行轉義。
請注意,原始的OP模式匹配一個',',而不是跟隨'''後跟''''的其他0個字符。也許,一個更安全的模式看起來像「」,(?![^ \\ [\\]] *])「',但是CSV解析器對於這樣的字符串應該是最好的。 –
您發佈的RegEx「,(?![^ \\ [\\]] *])」如果只有一對括號,例如: var = [some,list,here]但是如果在括號內有任何其他的括號,RegEx會打破ex。 VAR = [一些,列表,在這裏[東西]。你知道如何解決這個問題嗎? – helfo
是和否,取決於字符串本身。有一點是肯定的:你不能使用Java正則表達式來匹配嵌套結構。 –