2014-11-24 25 views
0

我想查找字符串中所有外部方括號對的內容。Java:正則表達式來找到外部方括號對

如果外部配對具有內部配對,則不應單獨配對。

例如字符串:[abc][123][cde[456[aq[]1q1]]]結果應該是:

  • ABC
  • CDE [456 [水溶液[] 1Q1]]

任何幫助將高度讚賞。 ..

+0

你不能用java的正則表達式,因爲它不支持遞歸和平衡組。 – 2014-11-24 15:42:43

+0

你不能使用任何**正則表達式,因爲它們[無法通過設計遞歸匹配](http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested -patterns)。 – 2014-11-24 16:11:20

+0

嵌套層次是否有限制? – 2014-11-24 16:14:42

回答

-1
"(^|\])\[(.*)\]($|[)" 

u唱最外面的括號總是有他們旁邊的支架或字符串的結尾或字符串的開始 所以這基本上匹配「[某事]」,如果它的前面有^或]並且[或$後面。

+0

這不適用於嵌套。 – 2014-11-24 16:11:57

0

這工作:)

 String[] ans=input.replaceAll("^\\[|\\]$","").replaceAll("\\]\\["," ").replaceAll(" ","\\[\\]\\[\\]").replaceAll("\\[\\] ","\\[\\]\\[\\]").split(" "); 
     System.out.println(Arrays.toString(ans)); 
1

前面已經說了,這是不可能用正則表達式。以下是方式

public List<String> readValidJsonStrings(String allText) { 
    List<String> jsonList = new ArrayList<String>(); 
    int[] endsAt = new int[1]; 
    endsAt[0] = 0; 
    while(true) { 
     int startsAt = allText.indexOf("{", endsAt[0]); 
     if (startsAt == -1) { 
      break; 
     } 
     String aJson = parseJson(allText, startsAt, endsAt); 
     jsonList.add(aJson); 
    } 
} 

private static String parseJson(String str, int startsAt, int[] endsAt) { 

    Stack<Integer> opStack = new Stack<Integer>(); 
    int i = startsAt + 1; 
    while (i < str.length()) { 

     if (str.charAt(i) == '}') { 
      if (opStack.isEmpty()) { 
       endsAt[0] = i + 1; 
       return str.substring(startsAt, i + 1); 
      } else { 
       opStack.pop(); 
      } 
     }else if (str.charAt(i) == '{') { 
      opStack.push(i); 
     } 

     i++; 
    } 

    return null; 
} 

將「{」更改爲「[」和其他修復程序。