2010-10-23 2 views

ответ

68

Немного более краткий:

String in = "Item(s): [item1.test],[item2.qa],[item3.production]"; 

Pattern p = Pattern.compile("\\[(.*?)\\]"); 
Matcher m = p.matcher(in); 

while(m.find()) { 
    System.out.println(m.group(1)); 
} 
0

Я бы разделить после обрезки предшествующего или завершающего барахла:

String s = "Item(s): [item1.test], [item2.qa],[item3.production] "; 
String r1 = "(^.*?\\[|\\]\\s*$)", r2 = "\\]\\s*,\\s*\\["; 
String[] ss = s.replaceAll(r1,"").split(r2); 
System.out.println(Arrays.asList(ss)); 
// [item1.test, item2.qa, item3.production] 
+0

Имейте в виду, что это не поддерживает вложенные скобки. – Gabe

+0

Выше решение не работает вообще, если оно гнездо или нет. – nottinhill

+0

@Stephan Kristyn: работает для меня на Java 1.6 на Mac OS X 10.6.7. – maerics

5

Вы должны использовать положительный предпросмотр и назад ':

(?<=\[)([^\]]+)(?=\]) 
  • (? < = [) Соответствует каждому нг затем [
  • ([^]] +) Соответствует любой строке, не содержащей]
  • (? =]) Совпадает все до того]
+0

Удивительный, но как я могу получить противоположный результат? Я хочу, чтобы хранитель содержал только содержимое внутри квадратных скобок. – candlejack

+0

Я не понимаю ваш вопрос - это именно то, что делает это регулярное выражение. Принимая ввод 'Пункт (ы): [item1.test], [item2.qa], [item3.production]' он возвращает 'item1.test' ' 'item2.qa' item3.production' – gnom1gnom

Смежные вопросы