Регулярное выражение для извлечения содержимого в квадратных скобках и скобках - PullRequest
0 голосов
/ 28 февраля 2020

Можно ли использовать выражение для извлечения содержимого квадратных скобок и скобок в список или массив? Это то, что у меня есть, он извлекает полную строку в скобках. Я хочу только текст в скобках.

String example = "[21](BULK(KIN[1[35]](MARK)))";    
Matcher m = Pattern.compile("\\(([^)]+)\\)").matcher(example);
while(m.find()) {
    System.out.println(m.group(1));    
}

Ответы [ 4 ]

0 голосов
/ 29 февраля 2020

Вы можете сделать это следующим образом:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        String example = "[21](BULK(KIN[1[35]](MARK)))";
        Matcher m = Pattern.compile("\\w+").matcher(example);
        while (m.find()) {
            list.add(m.group());
        }

        System.out.println(list);

        // Array
        String[] arr = list.toArray(new String[0]);
        System.out.println(Arrays.toString(arr));
    }
}

Вывод:

[21, BULK, KIN, 1, 35, MARK]
[21, BULK, KIN, 1, 35, MARK]
0 голосов
/ 28 февраля 2020

Если вы хотите извлечь только части, состоящие из букв, вы можете найти такие:

Matcher m = Pattern.compile("([a-zA-Z]+)").matcher(example);

и затем собрать совпадения в while-l oop. Изменить:

Matcher m = Pattern.compile("(\\w+)").matcher(example);

извлекает все словесные литералы, включая цифры.

0 голосов
/ 29 февраля 2020

Вы можете использовать следующее регулярное выражение для извлечения интересующих строк:

/(?<=\[|\()[^\[\]\(\)]+/x

Для строки

"[21 is a winner](BULK(KIN[1[35]](MARK my man)))"

совпадения с этим регулярным выражением будут "21 is a winner", "BULK", "KIN", "1", "35" и "MARK my man".

Регулярное выражение гласит: «соответствуют одному или нескольким (+) символам, отличным от (^) этих в строке '[]()' ([^\[\]\(\)] является классом символов ), которому непосредственно предшествует '(' или '[' ((?<=\[|\() является положительным взглядом позади ).

Следует отметить, что тот же результат получается, если строка имеет несбалансированные скобки или скобки:

"[21 is a winner((BULK]KIN(1[35]](MARK my man[[["

Регулярное выражение может быть написано для подтверждения того, что скобки и скобки сбалансированы (с использованием подвыражений ), но было бы проще проверить это отдельно, если это необходимо. Это можно сделать, создав пустой стек, а затем обработать строку посимвольно, используя следующие правила:

  • , если символ '' ' r '[' pu sh это в стек
  • , если символ ')', а стек не пустой, а верхний символ - '(', pop '(' off the stock; в противном случае круглые скобки не сбалансированы
  • , если символ «]», а стек непустой, а верхний символ «[», pop '[' вне ассортимента; в противном случае скобки не сбалансированы
  • , если символ отсутствует в строке "() []", игнорируйте его.
  • , если все символы в строке обработаны, скобки и скобки сбалансированы, если и только если стек тогда пуст.

Обратите внимание, что в любой момент времени стек содержит только символы '(' и '['.

0 голосов
/ 28 февраля 2020

Разве это не должно сработать, указав, какие символы следует игнорировать, и повторяйте это бесконечно по всей строке, например:

[^\[\]\(\)]+

+ в конце избегает совпадения пустых совпадений. Это не будет проверять правильность установленных скобок и скобок.

Мой код будет выглядеть следующим образом:

String example = "[21](BULK(KIN[1[35]](MARK)))";
Matcher m = Pattern.compile("[^\\[\\]\\(\\)]+").matcher(example);
while(m.find()) {
    System.out.print(m.group(0)+ " ");
}

Двойная обратная косая черта sh получается из java с использованием этого символа в качестве escape сам персонаж. Также обратите внимание, что я изменил оператор печати, чтобы он вел себя так, как вы описали в своих комментариях под своим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...