Необходимо ли быть в состоянии использовать нежадные кванторы, конкретно *?. Вы собираетесь, вероятно, хотеть следующее:
Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");
Это даст Вам шаблон, который будет соответствовать Вашей строке и помещать текст в квадратных скобках в первой группе. Взгляните на документация API Шаблона для получения дополнительной информации.
Для извлечения строки Вы могли использовать что-то как следующее:
Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
String s = m.group(1);
// s now contains "BAR"
}
String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));
Это возвратит значение между первым' [' и продлится']'
Foo [Панель] => Панель
Foo [Панель [тест]] => Панель [тест]
Примечание: необходимо добавить проверку ошибок, если входная строка не хорошо формируется.
Если просто необходимо получить то, что между []
, Вы могут использовать \[([^\]]*)\]
как это:
Pattern regex = Pattern.compile("\\[([^\\]]*)\\]");
Matcher m = regex.matcher(str);
if (m.find()) {
result = m.group();
}
при необходимости в нем для имения форму identifier + [ + content + ]
тогда, можно ограничить извлечение содержания только, когда идентификатор является алфавитно-цифровым:
[a-zA-Z][a-z-A-Z0-9_]*\s*\[([^\]]*)\]
Это проверит вещи как Foo [Bar]
, или myDevice_123["input"]
, например.
Основной вопрос
основная проблема состоит в том, когда Вы хотите извлечь содержание чего-то вроде этого:
FOO[BAR[CAT[123]]+DOG[FOO]]
Regex не будет работать и возвратится BAR[CAT[123
и FOO
.
, Если мы изменяем Regex на [1 112] тогда, мы в порядке, но тогда, при попытке извлечь содержание из более сложных вещей как:
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
Ни один из Regexe не будет работать.
самый точный Regex для извлечения надлежащего содержания во всех случаях был бы намного более сложным, поскольку он должен будет сбалансировать []
пары и дать Вам, они удовлетворяют.
простое решение А
, Если Ваши проблемы становится сложным и содержание []
произвольный, Вы могли бы вместо этого сбалансировать пар [1 115] и извлечь строку с помощью простого кода rathe, чем Regex:
int i;
int brackets = 0;
string c;
result = "";
for (i = input.indexOf("["); i < str.length; i++) {
c = str.substring(i, i + 1);
if (c == '[') {
brackets++;
} else if (c == ']') {
brackets--;
if (brackets <= 0)
break;
}
result = result + c;
}
Это - больше псевдокода, чем реальный код, я не кодер Java, таким образом, я не знаю, правилен ли синтаксис, но должно быть достаточно легко улучшить.
, Что количество - то, что этот код должен работать и позволить Вам извлекать содержание эти []
, однако сложный, это.
non-regex путь:
String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf("["),input.indexOf("]"));
альтернативно, для немного лучшей производительности/использования памяти (благодарит Hosam):
String input = "FOO[BAR]", extracted;
extracted = input.substring(input.indexOf('['),input.lastIndexOf(']'));
Я думаю, что Ваше регулярное выражение было бы похоже:
/FOO\[(.+)\]/
Предположение, что НЕЧТО, собирающееся быть постоянным.
Так, для помещения этого в Java:
Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);
предполагая, что ни в какой другой заключительной квадратной скобке не позволяют, / НЕЧТО \[([^\\]] *) \] /
Я определил бы это, я хочу максимальное количество не-] символы между [
и ]
. Их нужно оставить с обратными косыми чертами (и в Java, их нужно оставить снова), и определением не-] является класс символов, таким образом внутри [
и ]
(т.е. [^\\]]
). Результат:
FOO\\[([^\\]]+)\\]