Использование Java для поиска подстроки большей строки с использованием регулярного выражения

127
задан Chad Birch 3 April 2009 в 21:57
поделиться

7 ответов

Необходимо ли быть в состоянии использовать нежадные кванторы, конкретно *?. Вы собираетесь, вероятно, хотеть следующее:

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"
}
236
ответ дан Sonnenhut 3 April 2009 в 21:57
поделиться
String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));

Это возвратит значение между первым' [' и продлится']'

Foo [Панель] => Панель

Foo [Панель [тест]] => Панель [тест]

Примечание: необходимо добавить проверку ошибок, если входная строка не хорошо формируется.

1
ответ дан amit 3 April 2009 в 21:57
поделиться
  • 1
    Пятно на помощнике!! Сохраненный меня много стычки там. –  10 March 2014 в 11:02

Если просто необходимо получить то, что между [], Вы могут использовать \[([^\]]*)\] как это:

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, таким образом, я не знаю, правилен ли синтаксис, но должно быть достаточно легко улучшить.
, Что количество - то, что этот код должен работать и позволить Вам извлекать содержание эти [], однако сложный, это.

5
ответ дан Renaud Bompuis 3 April 2009 в 21:57
поделиться

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(']'));
31
ответ дан 24 November 2019 в 00:22
поделиться

Я думаю, что Ваше регулярное выражение было бы похоже:

/FOO\[(.+)\]/

Предположение, что НЕЧТО, собирающееся быть постоянным.

Так, для помещения этого в Java:

Pattern p = Pattern.compile("FOO\\[(.+)\\]");
Matcher m = p.matcher(inputLine);
2
ответ дан 24 November 2019 в 00:22
поделиться

предполагая, что ни в какой другой заключительной квадратной скобке не позволяют, / НЕЧТО \[([^\\]] *) \] /

0
ответ дан 24 November 2019 в 00:22
поделиться

Я определил бы это, я хочу максимальное количество не-] символы между [ и ]. Их нужно оставить с обратными косыми чертами (и в Java, их нужно оставить снова), и определением не-] является класс символов, таким образом внутри [ и ] (т.е. [^\\]]). Результат:

FOO\\[([^\\]]+)\\]
0
ответ дан 24 November 2019 в 00:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: