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

Я пытаюсь извлечь строку в квадрат или раунд.Строка может иметь только квадратные или круглые скобки

Я использую приведенное ниже регулярное выражение.

Pattern p = Pattern.compile("\\[(.*?)\\]|\\((.*?)\\)");

Выходная строка также включает в себя заключающие скобки.Ниже приведен код.

String example = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("\\[(.*?)\\]|\\((.*?)\\)");
Matcher m = p.matcher(example);
while(m.find()) {
    System.out.println(m.group(1));
}

Приведенный выше шаблон дает вывод в виде

(xxxxx)

(ггггг)

Ожидаемый результат:

xxxxx

ггггг

Ответы [ 3 ]

0 голосов
/ 30 января 2019

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

(?<=[([])[^()[\]]*(?=[)\]])

Объяснение:

  • (?<=[([]) - Позитивный взгляд на то, что предыдущий символ является либо (, либо [
  • [^()[\]]* - Соответствует любому символу, кроме открывающей или закрывающей скобки
  • (?=[)\]]) - Положительный взгляд вперед, чтобы убедиться, что он соответствует либо ) или ]

Демонстрация

Примеры кодов Java,

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("(?<=[(\\[])[^()\\[\\]]*(?=[)\\]])");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group());
}

Печать,

xxxxx
yyyyy

В качестве альтернативы, как я уже упоминал выше, вы можете использоватьэто не смотреть вокруг регулярных выражений и захватить только group1, чтобы получить ваш контент, так как это регулярное выражение не имеет никакого чередования, следовательно, только одна группа.

[([]([^()[\]]*)[)\]]

Демо без обходных регулярных выражений

Образец кода Java с отсутствующим внешним видомd regex, где вам нужно захватить, используя group(1)

String s = "Example_(xxxxx)_AND_(yyyyy)_2019-01-28";
Pattern p = Pattern.compile("[(\\[]([^()\\[\\]]*)[)\\]]");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

Prints,

xxxxx
yyyyy
0 голосов
/ 30 января 2019

Это полный пример для вас.

public class ExtractContentExample {

    private static final Pattern PATTERN2 = Pattern.compile("^[^\\(]{0,}\\(|([\\)][^\\(\\)]{1,}[\\(])|\\)[^\\)]{0,}$");

    public void test22212 () {
       String[] split = PATTERN2.split("(I )Comparison_(am )_AND_(so )_2019-01-28Comparison_(handsome!)");
       for (int i = 0; i< split.length; i++) {
           if (split[i] != null && !split[i].isEmpty()) {
               System.out.println(split[i]);
           }
       }
   }

}

Надеюсь, это поможет

0 голосов
/ 30 января 2019

Вы можете использовать lookahead и lookbehind : -

(?<=\[).*?(?=\])|(?<=\().*?(?=\))

или вы можете применить закон Де Моргана к приведенному выше регулярному выражению и использовать это: -

(?<=\[|\().*?(?=\]|\))

Пояснение

(?<=\[|\() - с предшествующим [ или (
.*? - любое количество символов, не жадное
(?=\]|\)) - с последующим] или )

Демо

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