2016-06-22 70 views
2

好的,所以我試圖用「,」分隔字符串,它們不在'['或']'內。我有一個適用於JavaScript的RegEx,但一直無法將其轉換爲Java語法。將RegEx從JavaScript轉換爲Java

JS正則表達式:

/,(?![^[]*])/g 

,例句:

ex1 , [ex2 , ex3 ] , ex 4 , ex 4, [ex , ex ] 

它適用於http://refiddle.com正常,但當我試圖用Java(Eclipse中下)使用正則表達式我得到一個錯誤說:

靠近索引10的未封閉字符類別 ,(?![^ [] *])

我所做的只是在開頭刪除'/'和結尾的「/ g」,我一直無法翻譯語法。

什麼是最好的方法來實現這一目標?

回答

4

更新嵌套的括號支持

既然你也需要支持嵌套方括號和逗號應在方括號內被忽略,你需要一個簡單的解析器來收集文字的你所需要的塊。

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的],角色職業外,沒有進行轉義。

+0

請注意,原始的OP模式匹配一​​個',',而不是跟隨'''後跟''''的其他0個字符。也許,一個更安全的模式看起來像「」,(?![^ \\ [\\]] *])「',但是CSV解析器對於這樣的字符串應該是最好的。 –

+0

您發佈的RegEx「,(?![^ \\ [\\]] *])」如果只有一對括號,例如: var = [some,list,here]但是如果在括號內有任何其他的括號,RegEx會打破ex。 VAR = [一些,列表,在這裏[東西]。你知道如何解決這個問題嗎? – helfo

+1

是和否,取決於字符串本身。有一點是肯定的:你不能使用Java正則表達式來匹配嵌套結構。 –