表达出来
Getting out an expression
假设我有这两个例子
- (A = 1)和(B = 2)
- (a = 1)(b = 2 ())
我需要一种方法来获得以下数组:
-
[(],[A][=][1],[)],[and],[(],[B],[=],[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。
相关文章:
- 没有找到相关文章