得出一个表达

时间:2014-05-21 09:01:27

标签: javascript arrays regex substring

假设我有这两个例子

  1. (A = 1)和(B = 2)
  2. (A = 1)(B = 2())。
  3. 我需要一种获取以下数组的方法:

    1. [(],[A][=][1],[)],[and],[(],[B],[=],[2],[)]
    2. [(],[A][=][1],[)],[(],[B],[=],[2],[(],,[)][)]
    3. 我试图做的是以下

      使用以下函数查找分隔符(在这种情况下,分隔符是空格“”和任何括号()

       function findExpressionDelimeter (textAreaValue){
          var delimiterPositions = [];
          var bracesDepth = 0;
          var squareBracketsDepth = 0;
          var bracketsDepth = 0;
      
          for (var i = 0; i < textAreaValue.length; i++) {
              switch (textAreaValue[i]) {
                  case '(':
                      bracketsDepth++;
                      delimiterPositions.push(i);
                      break;
                  case ')':
                      bracketsDepth--;
                      delimiterPositions.push(i);
                      break;
                  case '[':
                      squareBracketsDepth++;
                      break;
                  case ']':
                      squareBracketsDepth--;
                      break;
                  default:
                      if (squareBracketsDepth == 0 && textAreaValue[i] == ' ') {
                          delimiterPositions.push(i);
                      }
              }
          }
          return delimiterPositions;
      }
      

      然后我尝试循环返回的值并使用substring提取值。问题是,当我有()时,我需要获取下一个子字符串以及括号。这就是我被困住的地方。

          function getTextByDelimeter(delimiterPositions, value) {
                  var output = [];
                  var index = 0;
                  var length = 0;
                  var string = "";
      
                  for (var j = 0; j < delimiterPositions.length; j++) {
      
                      if (j == 0) {
                          index = 0;
                      } else {
                          index = delimiterPositions[j - 1] + 1;
                      }
      
                      length = delimiterPositions[j];
      
      
                      string = value.substring(index, length);
                      output.push(string);
                  }
                  string = value.substring(length, value.length);
                  output.push(string);
                  return output;
              }
      

      任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以匹配您感兴趣的令牌:

var str = "(A = 1) and ( B = 2)";
var arr = str.match(/[()]|[^()\s]+/g);

结果:

["(", "A", "=", "1", ")", "and", "(", "B", "=", "2", ")"]

正则表达式有一些评论:

[()]     # match a single character token
|        # or
[^()\s]+ # match everything else except spaces

如果您想添加更多单个字符标记,例如=,只需将其添加到两个字符类中即可。即:[()=]|[^()=\s]+

答案 1 :(得分:0)

答案的类似问题是here

您可以拆分string(string.split('')),然后从whitespaces中删除array,或者只是在切换阻止之前检查array[i] != ' '是否正确。

答案 2 :(得分:0)

你想要做的是lexical analyser

正则表达式不允许您解析语言(数学表达式是一个)。公式的树分解不能用它来完成。

但是,正则表达式可以让您区分令牌。这通常通过读取字符流来完成。一旦您检测到词法,就会生成令牌。

如果要检查公式的有效性或计算值:您需要一个解析器(语义分析器)。这不能使用正则表达式完成。