假设我有这两个例子
我需要一种获取以下数组的方法:
[(],[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;
}
任何帮助都将不胜感激。
答案 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。
正则表达式不允许您解析语言(数学表达式是一个)。公式的树分解不能用它来完成。
但是,正则表达式可以让您区分令牌。这通常通过读取字符流来完成。一旦您检测到词法,就会生成令牌。
如果要检查公式的有效性或计算值:您需要一个解析器(语义分析器)。这不能使用正则表达式完成。