Если вам просто нужно получить что-нибудь между []
, вы можете использовать \[([^\]]*)\]
, например:
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 на \[(.*)\]
, тогда мы в порядке, но потом, если вы пытаетесь извлечь контент из более сложных вещей, таких как:
FOO[BAR[CAT[123]]+DOG[FOO]] = myOtherFoo[BAR[5]]
Ни одно из регулярных выражений не будет работать.
Самый точный 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-кодер, поэтому не знаю, правильный ли синтаксис, но его должно быть достаточно легко улучшить.
Считается, что этот код должен работать и позволяет извлекать содержимое []
, каким бы сложным оно ни было.