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

Как видно из ?download.file:

Для методов "wget" и "curl" системный вызов выполняется для инструмента, заданного методом, и соответствующая программа должна быть установлена ​​на вашей системы и быть в пути поиска исполняемых файлов. Они будут блокировать всю другую активность в процессе R до тех пор, пока они не завершат: это может сделать GUI не отвечающим.

blockquote>

Поэтому сначала вам следует установить curl. Смотрите это Как мне установить и использовать curl в Windows? чтобы узнать, как это сделать. Лучший!

127
задан 09.10.2019, 02:02

3 ответа

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

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
ответ дан 09.10.2019, 02:07
  • 1
    @cletus: Хороший вызов! @digiarnie: I' ve добавил пересмотр ответа, который содержит некоторый код соломенного человека для получения соответствия. – Bryan Kyle 09.10.2019, 02:08
  • 2
    Используя вышеупомянутый шаблон, как Вы затем использовали бы это для извлечения строки, содержащей строковую ПАНЕЛЬ? I' m рассмотрение Шаблона API и API Matcher, но I' m все еще уверенный, как получить саму строку. – digiarnie 09.10.2019, 02:08
  • 3
    It' s стоящий упоминания, что, если существует новая строка между квадратными скобками, это перестанет работать и необходимо использовать Шаблон. Флаг DOTALL для предотвращения этого. – cletus 09.10.2019, 02:09
String input = "FOO[BAR]";
String result = input.substring(input.indexOf("[")+1,input.lastIndexOf("]"));

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

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

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

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

1
ответ дан 09.10.2019, 02:05
  • 1
    Пятно на помощнике!! Сохраненный меня много стычки там. –  10.03.2014, 13: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
ответ дан 09.10.2019, 02:06

Теги

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