有很多方法可以使用正则表达式和相应地使用match / test match来检查字符串是否有效。 我正在检查包含字母(ab),运算符(+,-,/,*),仅特殊字符(例如(')','(')和数字(0-9))的表达式是否有效< / p>
我已经尝试过传统方法,当字符为'('时推送,而当')为弹出时,是否检查平衡括号。 代码几乎甚至对操作员也有效,但是在某些情况下我缺乏支持。 提供的代码在某种程度上可能是正确的。
checkBalancedString(text){
let format = /[A-Za-z0-9]/;
let expression = /[+-\/*]/
if(text.length <=2){
if(format.test(text[0])){
return true;
}
return false;
}
for(let i=0;i<text.length;i++){
let stringcheck=[]
if(text[i]== '('){
stringcheck.push(text[i])
}
switch(text[i]){
case ')':
if(!stringcheck.length){
return false;
}
stringcheck.pop();
break;
}
let checkalphaformat = format.test(text[i]);
if(checkalphaformat){
let nextChar = format.test(text[i+1]);
let nexttonextChar = expression.test(text[i+2])
if(nextChar || nexttonextChar){
return false
}
}else{
let nextChar = format.test(text[i+1]);
if(!nextChar){
return false;
}
if(text[i+2]){
let nextChar = format.test(text[i+2])
if(!nextChar){
return false;
}
}
}
if(!stringcheck.length){
return true;
}
}
}
简而言之,字符串应返回有效表达式,例如: (a + b),a + b,a / 9,b * 5,(e-6 *(d + e)),(a + b)/(c-d) 和类似的表达: +,-,-a,+ a-,(a +,(a + v,e *)
当每个字符后跟运算符或括号时,表达式应完整 任一运算符后仅跟字符 括号后面是唯一字符。 当前索引(前后)中不能同时包含运算符,并且不能同时包含两个字符
答案 0 :(得分:1)
看起来您真正想要的是检查公式的有效性,而不是检查特定种类的公式。
这是我在这种情况下使用的:
// Return true if the passed string is a valid mathematical expression
// taking as parameter a, b, c, etc.
// Examples:
// 2*a+b*b
// (e-6*(d+e))
// sin(a*PI + b.length) / ( round(d) - log(c) + +("Basse Qualité"===e) )
// for (var i=0, total=0; i<10; i++) total += pow(a,i); return total
check = function(str){
try {
str = str.replace(/(^|[^\."'a-zA-Z])([a-zA-Z]\w+)\b/g, function(s, p, t){
return t in Math ? p + "Math." + t : s;
});
if (!/\breturn\b/.test(str)) str = "return ("+str+")";
var args = "abcdefghijklmnopqrstuvwxyz".split("");
var f = Function.apply(Function, args.concat(str));
f.apply(null, args); // if it works for args it should be ok for numbers...
return true;
} catch (e) {
console.log("error while checking formula", e, str);
return false;
}
}
适用于您的案例的基本思想:
Function
作为参数名称的["a", "b", ...]
["a", "b", ...]
)执行此功能如果您不希望像我的示例那样自由,也可以测试字符范围(如果您不想内联,则不必允许;
或̀ ,
javascript)