Regex для захвата непарных скобок или скобок - PullRequest
2 голосов
/ 25 октября 2019

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

Programming is productive, (achieving a lot, and getting good results), it is often 1) demanding and 2) costly.

Как мне захватить 1) и 2). Я пробовал:

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

Но полученный результат включает в себя s), как показано ниже, вместо 1) и 2):

s), 1) and 2)

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

Ответы [ 2 ]

2 голосов
/ 25 октября 2019

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

Для ввода String "(*(**)**) first) second) (**) (*ksks*) third) ** fourth)( **)

Он печатает

первый)
второй)
третий)
четвертый)

Все остальные скобки игнорируются, поскольку они совпадают.

      String s =
            "(*(**)**) first) second) (**) (*ksks*) third) ** fourth)( **)";
      Pattern p;
      List<String> found = new ArrayList<>();
      Stack<Character> tokens = new Stack<>();
      int pcount = 0;

      for (char c : s.toCharArray()) {
         switch (c) {
            case ' ':
               tokens.clear();
               break;
            case '(':
               pcount++;
               break;
            case ')':
               pcount--;
               if (pcount == -1) {
                  String v = ")";
                  while (!tokens.isEmpty()) {
                     v = tokens.pop() + v;
                  }
                  found.add(v);
                  pcount = 0;
               }
               break;
            default:
               tokens.push(c);
         }
      }
      found.forEach(System.out::println);

Примечание. Интегрирование скобок (]) вВышесказанное было бы проблемой (хотя и не невозможно), потому что нужно было бы проверить конструкции типа ( [ ) ], где неясно, как их интерпретировать. Вот почему при определении требований такого рода они должны быть точно прописаны.

2 голосов
/ 25 октября 2019

Может быть,

\b\d+\)

может просто вернуть желаемый результат, я думаю.

Демо 1

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

\b\d[^)]*\) 

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

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\b\\d[^)]*\\)";
        final String string = "Programming is productive, (achieving a lot, and getting good results), it is often 1) demanding and 2) costly.\n\n"
             + "Programming is productive, (achieving a lot, and getting good results), it is often 1a b) demanding and 2a a) costly.\n\n\n"
             + "Programming is productive, (achieving a lot, and getting good results), it is often 1b) demanding and 2b) costly.\n\n"
             + "It is not supposed to match ( s s 1) \n";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

Выход

Full match: 1)
Full match: 2)
Full match: 1a b)
Full match: 2a a)
Full match: 1b)
Full match: 2b)
Full match: 1)

Схема RegEx

jex.im визуализирует регулярные выражения:

enter image description here

...