表达出来

Getting out an expression

本文关键字:      更新时间:2023-09-26

假设我有这两个例子

  1. (A = 1)和(B = 2)
  2. (a = 1)(b = 2 ())

我需要一种方法来获得以下数组:

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

我想做的是如下

使用以下函数查找分隔符(在本例中,分隔符是空格""和任何括号)()

 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;
        }

您可以直接匹配您感兴趣的标记:

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]+,只需将其添加到两个字符类中。Ie: string(string.split(''))

您要做的是一个词法分析器。

正则表达式不允许解析语言(数学表达式就是其中之一)。公式的树分解不能用它来做。

然而,regex允许你区分标记。这通常是通过读取字符流来完成的。一旦检测到词素,就可以生成令牌。

如果你想检查公式的有效性,或者计算值:你需要一个解析器(语义分析器)。

类似的问题与答案在这里。

你可以拆分你的whitespaces,然后从array[i] != ' '中删除array,或者在你的开关块之前检查CC_13。

相关文章:
  • 没有找到相关文章