Если у меня есть такая строка:
FOO[BAR]
Мне нужен общий способ получить строку «BAR» из строки, чтобы независимо от того, какая строка находится в квадратных скобках, она могла бы получить строку.
например
FOO[DOG] = DOG
FOO[CAT] = CAT
Вы должны быть в состоянии использовать не жадные квантификаторы, в частности * ?. Вы, вероятно, захотите следующее:
Pattern MY_PATTERN = Pattern.compile("\\[(.*?)\\]");
Это даст вам шаблон, который будет соответствовать вашей строке и поместит текст в квадратные скобки в первой группе. Посмотрите документацию Pattern API для получения дополнительной информации.
Чтобы извлечь строку, вы можете использовать что-то вроде следующего:
Matcher m = MY_PATTERN.matcher("FOO[BAR]");
while (m.find()) {
String s = m.group(1);
// s now contains "BAR"
}
путь без регулярных выражений:
в качестве альтернативы, для немного лучшей производительности / использования памяти (спасибо Hosam):
источник
lastIndexOf(']')
вместо этого, который будет обрабатывать вложенные скобки. Кроме того, я считаю, что использованиеindexOf(char)
будет быстрее, чемindexOf(String)
.lastIndexOf
как наверняка будет быстрее найти закрывающую скобку.Это рабочий пример:
RegexpExample.java
Он отображает:
источник
источник
Если вам просто нужно получить что-то среднее
[]
, вы можете использовать\[([^\]]*)\]
это так:Если вам нужно, чтобы он был в форме,
identifier + [ + content + ]
вы можете ограничить извлечение контента только тогда, когда идентификатор является буквенно-цифровым:Это будет проверять такие вещи, как
Foo [Bar]
,myDevice_123["input"]
например.Главная проблема
Основная проблема заключается в том, когда вы хотите извлечь содержимое примерно так:
Regex не будет работать и вернется
BAR[CAT[123
иFOO
.Если мы изменим Regex на
\[(.*)\]
тогда, мы в порядке, но потом, если вы пытаетесь извлечь контент из более сложных вещей, таких как:Ни одно из регулярных выражений не будет работать.
Самый точный Regex для извлечения правильного контента во всех случаях будет намного сложнее, так как для этого потребуется сбалансировать
[]
пары и дать вам их контент.Более простое решение
Если ваши проблемы становятся сложными, а содержимое
[]
произвольным, вы можете вместо этого сбалансировать пары[]
и извлечь строку, используя обычный старый код, чем Regex:Это скорее псевдокод, чем реальный код, я не Java-кодер, поэтому я не знаю, правильный ли синтаксис, но его должно быть достаточно легко улучшить.
Считается, что этот код должен работать и позволять вам извлекать содержимое
[]
, каким бы сложным оно ни было.источник
Я думаю, что ваше регулярное выражение будет выглядеть так:
Предполагая, что FOO будет постоянным.
Итак, чтобы поместить это в Java:
источник
Это вернет значение между первым '[' и последним ']'
Foo [Bar] => Бар
Foo [Bar [тест]] => Бар [тест]
Примечание: вы должны добавить проверку ошибок, если входная строка не правильно сформирована.
источник
при условии, что никакие другие закрывающие квадратные скобки не допускаются в / FOO \ [([^ \]] *) \] /
источник
Я бы определил, что я хочу максимальное количество не] символов между
[
и]
. Они должны быть экранированы с помощью обратной косой черты (а в Java их нужно экранировать снова), и определение non-] является классом символов, то есть внутри[
и]
(т.е.[^\\]]
). Результат:источник
Вот так это работает, если вы хотите проанализировать некоторую строку, которая идет от mYearInDB.toString () = [2013], это даст 2013
источник
Это регулярное выражение работает для меня:
пример:
вывод:
Проверено на http://rubular.com/
источник
Это вернет строку, содержащую только строку в квадратных скобках.
Это удалит всю строку снаружи из квадратных скобок.
Вы можете проверить этот пример кода Java онлайн: http://tpcg.io/wZoFu0
Вы можете проверить это регулярное выражение здесь: https://regex101.com/r/oUAzsS/1
источник