javascript - 检查数值表达式(线性)是否有效?
问题描述
有很多方法可以使用正则表达式检查字符串是否有效,并相应地使用匹配/测试匹配。我正在检查包含字母(ab)、运算符(+、-、/、*)、仅特殊字符(例如 (')'、'(') 和数字 (0-9))的表达式是否有效
我已经尝试过传统方法在字符为“(”时推送,在“)”时弹出并检查是否平衡括号。代码几乎适用于偶数运算符,但在某些情况下我落后了。提供的代码在某种程度上可能是正确的。
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;
}
}
}
简而言之,字符串应该返回有效的 where 表达式,例如: (a+b), a+b, a/9, b*5 , (e-6*(d+e)), (a+b)/(cd) 和表达式如:+, - ,-a,+a-, (a+, (a+v, e*)
当每个字符后面都跟有运算符或括号时,表达式应该是完整的,任一运算符后面只有字符,括号后面跟着唯一的字符。从当前索引(前面和后面)中不应有运算符一起,并且不应有两个字符一起
解决方案
看起来您真正想要的是检查公式的有效性,而不是检查特定类型的公式。
这是我在这种情况下使用的:
// 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 作为正文和["a", "b", ...]
参数名称 - 使用示例输入执行此函数(在我的情况下
["a", "b", ...]
)
如果您不想要像我的示例中那样的自由,您还可以测试字符范围(如果;
您不想要内联 javascript,则不必允许或̀),
推荐阅读
- javascript - 在 JavaScript 中将美元转换为美分
- python - 在 Python 中,有效过滤可能组合的子序列
- cuda - 在抛出 'thrust::system::system_error' 的实例后调用终止 what(): parallel_for failed: cudaErrorInvalidValue: invalid argument
- typo3 - TYPO3 routeEnhancers 用于新闻存档(DateMenu)和分页
- sql - 从 ROW_Number 中选择连续行
- google-cloud-platform - 将数据从 API 上传到 GCP 数据准备
- java - 如何将列表直接实例化为实际参数?
- javascript - 传单弹出窗口无法更改位置
- python - 如何将一列字符串转换为超链接?
- node.js - 成功购买后如何阻止 Stripe 覆盖客户端的会话 cookie