2014-11-24 3 views
0

Я хотел бы найти содержимое всех пар внешних квадратных скобок в строке.Java: регулярное выражение, чтобы найти пары внешних квадратных скобок

Если внешняя пара имеет внутреннюю пару, то ее не следует сопоставлять отдельно.

Например, строка: [abc][123][cde[456[aq[]1q1]]] результаты должны быть:

  • аЬс
  • CDE [456 [водн [] 1Q1]]

Любая помощь будет высоко оценена. ..

+0

Вы не можете использовать регулярное выражение java, поскольку оно не поддерживает группы рекурсии или балансировки. –

+0

Вы не можете использовать ** любое ** регулярное выражение, поскольку они [не могут соответствовать рекурсивно по дизайну] (http://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested -patterns). –

+0

есть ли ограничение уровней гнездования? –

ответ

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

u пей самые внешние скобки всегда имеют скобку рядом с ними или конец строки или начало строки , поэтому это по существу соответствует «[something]», если ему предшествует^или] и имеет [или $ после него.

+0

Это не подходит для гнездования. –

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; 
} 

Изменить «{" to "[" и другие исправления.