Использование Java Regex для нахождения подстроки с другой подстрокой - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть программа, которая принимает пользовательский ввод в форме логического выражения (например: (p => (r || q))) и разделяет строку на подстроки, которые определены в скобках. Я использую шаблон и совпадение.
Так, например, пользовательский ввод:
((р || д) => г) .
Я хочу получить 2 подстроки:
р || д
а также (р || д) => г.
Однако я только получаю это:
(p || q

Вот код, который я использую

 Scanner scanner = new Scanner(System.in);
 System.out.println("Enter formula: ");
 String formula = scanner.next();
 Pattern pattern = Pattern.compile("\\((.*?)\\)");
 Matcher matcher = pattern.matcher(formula);
         while(matcher.find())
         {
          String s = matcher.group(1);

          System.out.println(s);
          }

Так что мне нужен способ, чтобы программа нашла все подстроки в этой строке.

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

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

public static void main(String[] args) throws InterruptedException {
    findSubExpressions("((p||q)=>r)");
}

private static void findSubExpressions(String input) {
    Deque<Integer> startingBrackets = new LinkedList<Integer>();

    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (c == '(') {
            startingBrackets.push(i);
        } else if (c == ')') {
            int correspondingStart = startingBrackets.pop();
            logSubExpression(input.substring(correspondingStart+1, i));
        }
    }
}

private static void logSubExpression(String subExpression) {
    System.out.println(subExpression);
}
2 голосов
/ 21 декабря 2011

Вы не можете сделать это с помощью регулярных выражений.

Поскольку использование скобок является признаком того, что то, что вы хотите сделать, выходит за рамки возможностей регулярных выражений.Регулярные выражения описывают грамматику Хомского-3, которая не может иметь скобочные структуры.Кронштейны доступны в грамматике Хомского-2.Таким образом, вы должны определить соответствующую грамматику с правилами синтаксического анализа.Хорошая библиотека, которая может помочь вам достичь желаемого, - ANTLR .

...