Javascript регулярное выражение для захвата всех возможных математических операций между круглыми скобками - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь записать математические выражения между круглыми скобками в строку с javascript. Мне нужно захватить скобки, которые включают ТОЛЬКО числа и математические операторы [0-9], +, -, *, /,% и десятичную точку. Приведенные ниже примеры демонстрируют, чего я добиваюсь. Мне удалось приблизиться к желаемому результату, но вложенные скобки всегда портят мое регулярное выражение, поэтому мне нужна помощь! Мне также нужно, чтобы он выглядел глобально, а не только для первого случая.

let string = "If (2> 1, if (a> 100, (- 2 * (3-5) * 1004) * (8-2)) , (1 + 2) ), (3 (1 + 2)) ) ";

По возможности я хочу преобразовать этот синтаксис

if (условие, iftrue, iffalse)

в этот синтаксис

if (condition) {iftrue} else {iffalse}

, чтобы его можно было оценить по javascript и просмотреть в браузере. Я сделал это до сих пор, но если блоки iftrue или iffalse содержат круглые скобки, все взрывается! Поэтому я пытаюсь захватить эту скобку и вычислить перед преобразованием синтаксиса. Любой совет приветствуется.

Самым близким, что я получил, был этот /[\d()+-*/.]/g, который получает то, что я хочу, но в этом примере

( 1 + 2) (1 <<strong> 1) sdasdasd (1 * (2 + 3))

вместо отклонения (1 <1) группа полностью соответствует <strong>(1 и 1) . Мой идеальный сценарий:

(1 + 2) (1 <1) sdasdasd <strong>(1 * (2 + 3))

Другой пример: let codeToEval = "if (a> 10, 2, 2 * (b + 4))"; codeToEval - это переданная в функцию функция, которая заменяет a и b правильными значениями, поэтому все заканчивается следующим образом. codeToEvalAfterReplacement = "if (5> 10,2,2 * (5 + 4))"; И теперь я хочу преобразовать это в

if(5>10) {
  2
} else {
  2*(5+4)
}

, чтобы его можно было оценить с помощью javascript eval () и в конечном итоге просмотреть для пользователей.

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

Ваше текущее регулярное выражение /[\d()+-*/.]/g будет соответствовать отдельным символам из класса, но несколько раз из-за флага g, поэтому (1 и 1) все еще сопоставляются с (1 <1). </p>

На основе по вашим требованиям к шаблону я бы изменил его на /\([-+*/%.0-9()]+\)/g. Это будет соответствовать круглым скобкам, содержащим один или несколько символов, которые вы описываете внутри них.

Обратите внимание, что ваш текущий шаблон имеет - где-то в середине класса, что может привести к странным поведениям, потому что некоторые движки регулярных выражений будут трактовать +-* внутри класса как диапазон (плюс звездочку, которая является диапазоном строк). Обратите внимание, что я поместил - в начале класса в новом шаблоне, чтобы он соответствовал фактическому -.

Я предполагал, что не будет пустых скобок (), если есть, вы можете изменить + (один или несколько) после ] до * (ноль или более) Флаг g все еще добавляется, поэтому вы подходите к каждому из таких выражений.

Я не могу сказать со 100% уверенность в том, что новое регулярное выражение позволит вам надежно преобразовать синтаксис, который вы указали, поскольку это зависит от сложности кодовых блоков 'iftrue' и 'iffalse'. Посмотрите, сможете ли вы заставить его работать с новым шаблоном, иначе вам может понадобиться поискать другие решения для разбора кода.

0 голосов
/ 11 апреля 2020
Call function in if parenthesis and all conditions in that function.    

if(test()){
    // if code 
    }else{
    // else code  
    }

    function test(){
      // check both cases here 
      if(case 1 && case 2){
        return true
      }
      return false; 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...