Мне нужно получить все выражения между парентезами в математической операции - PullRequest
0 голосов
/ 10 июля 2019

Мне нужно получить все выражения между скобками в математической операции с помощью scala.

Я пытался сделать это с помощью регулярного выражения. И это работает с такими выражениями, как:

(2+4) -> Результат: 2+4

4*(3+1) -> Результат: 3+1

Но я не могу получить все значения, как в следующем примере:

(2+1)*(4-3) -> Результат: 2+1)*(4+3

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

`2+1`

`4+3`

Где «формула» - это входное выражение

    val regex = Pattern.compile("\\((.*)\\)")
    val regexMatcher = regex.matcher(formula)

    while (regexMatcher.find()) {
        println(regexMatcher.group(1)); //Fetching Group from String
    }

РЕДАКТИРОВАТЬ: В случае (1+(2+3)), хороший результат будет 1+(2+3)

Ответы [ 2 ]

3 голосов
/ 10 июля 2019
  1. Вы можете использовать квантификатор с неохотой *? вместо *, чтобы захватывать только символы до первого ).

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

Объединение:

Pattern.compile("""\((.*?)\)""")
  1. Как упоминается в ответе mrzasa, регулярные выражения являются неправильным инструментом, если вам когда-либо понадобится обрабатывать вложенные скобки (но обратите внимание на предостережение Как сопоставить строку в скобках (вложенную) в Java? и Регулярное выражение для соответствия сбалансированным скобкам ).

    В Scala вы можете использовать комбинаторы синтаксического анализатора . Ответ Huynhjl на Анализ значений, содержащихся во вложенных скобках , описывает что-то, что вы можете использовать в качестве отправной точки.

2 голосов
/ 10 июля 2019

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

([^)]*)

, это ограничивает повторение символами, которые не являются закрывающей скобкой.

В Scala это, вероятно, будет:

    val regex = Pattern.compile("\\(([\\)]*)\\)")

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

Также обратите внимание, что это не поддерживает вложенные скобки, например (1+(2+3))

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