使用javascript中的数学方程式拆分变量
Split a variable using mathematical equations in javascript
实际上我有两个问题。我想做的是首先检查用户输入的值是否是正确的数学方程。例如,如果使用输入x + y ( z
,则应检测为无效公式,x + y ( z )
为正确公式,
我想做的第二件事是将公式从+ - * / ()
符号中分离出来,所以上面的公式将返回为x, y, z
。
我所做的是低于
var arr = [];
var s = 'x + y ( z )';
arr = s.split("(?<=[-+*/])|(?=[-+*/])");
console.log(arr);
这返回一个只有一个数据的数组,如[x + y ( z )]
另外,变量不是单个字母。他们可能如年度价格、收盘价等
有人能帮我解决这个问题吗。提前感谢
更新:我也尝试过"/[^+/*()-]+/g"
对于第二部分:
var s = 'x + y ( z )';
var arr = s.match(/('w)/g);
console.log(arr);
document.write(JSON.stringify(arr));
当然,您必须首先检查输入的有效性。
编辑:使用Tomer W的答案建议eval()
:
function checkExpression(str) {
// check for allowed characters only
if (/[^'w'd'(')'+'*'/'-'s]/.exec(s) != null)
return false;
// extract variable names, assuming they're all one letter only
var arr = s.match(/('w+)/g);
// instantiate the variables
arr.forEach(function (variable) {
eval(variable + '= 1');
});
// ( is alone, replace it by * (
str = str.replace(/'(/g, '* (');
try {
eval(str);
return true;
}
catch (ex) {
console.log(ex);
return false;
}
}
它很脏,但大多数时候都能工作(Tomer W指出了一些边缘情况,如++62+5
或54++++6
,可以通过另一个正则表达式检查来避免),你有更复杂的例子要测试吗?
警告语
前方有非常非常危险的方法!!!
我发布这个是因为这是一个有效的答案,但你应该非常小心,因为用户可能会完全破坏你的网站
不要让一个用户输入在eval中用于另一个用户!!!永远
实际答案
您可以使用浏览器内置的java脚本编译器,并使用eval()
function checkEq(equ)
{
for(ch in equ){
// check that all characters in input are "equasion usable"
if(" +-*/1234567890e^&%!=".indexOf(ch) === -1)
{ // if there are invalid chars
return false;
}
}
try{
// try running the equ, will throw an exception on a syntax error.
eval(equ);
return true; // no exception
}
catch(ex){
return false; // syntax error
}
}
Plunker示例
正如我之前所指出的!极度小心!
使用@ShanShan和@Tomer W的答案,我编写了一个公式验证器。代码如下。在这个验证器中,我检查打开和关闭括号、额外的/*-+符号、不需要的符号等。
如果用户希望创建并验证具有x、y、z的公式变量,用户必须将变量添加到数组中并将其传递给该验证器编写了公式,以便验证器接受不是数字的变量。
我还使用了本文中提到的自定义集。https://stackoverflow.com/a/4344227/918277
重要提示:此java脚本函数无法验证sin、cos、tan、log等非常复杂的公式。脚本会将它们识别为字母,并返回false
function StringSet() {
var setObj = {}, val = {};
this.add = function(str) {
setObj[str] = val;
};
this.contains = function(str) {
return setObj[str] === val;
};
this.remove = function(str) {
delete setObj[str];
};
this.values = function() {
var values = [];
for ( var i in setObj) {
if (setObj[i] === val) {
values.push(i);
}
}
return values;
};
}
/**
*
* @param _formulaInputs
* Array of use entered inputs to be use in formula
* @param _formula
* User entered formula
* @returns {Boolean}
*/
function validateFormula(_formulaInputs, _formula) {
var formula = _formula;
var bracketStack = new Array();
var formulaDescArray = [];
var formulaDescInForm = new StringSet();
for (var i = 0; i < _formulaInputs.length; i++) {
formulaDescInForm.add(_formulaInputs[i]);
}
/* Regex to check for unwanted symbols(! @ # $ etc.) */
if (/[^'w'd'(')'+'*'/'-'s]/.exec(formula) != null) {
return false;
}
for (var i = 0; i < _formula.length; i++) {
if ((_formula.charAt(i) == '/' || _formula.charAt(i) == '*'
|| _formula.charAt(i) == '-' || _formula.charAt(i) == '+')
&& (_formula.charAt(i + 1) == '/'
|| _formula.charAt(i + 1) == '*'
|| _formula.charAt(i + 1) == '-' || _formula
.charAt(i + 1) == '+')) {
return false;
}
}
var lastChar = formula.charAt(formula.length - 1);
if (lastChar == '/' || lastChar == '*' || lastChar == '-'
|| lastChar == '+') {
return false;
}
formulaDescArray = formula.split(/['/'*'-'+'()]/g);
/* Remove unwanted "" */
for (var i = 0; i < formulaDescArray.length; i++) {
if (formulaDescArray[i].trim().length == 0) {
formulaDescArray.splice(i, 1);
i--;
}
}
/* Remove unwanted numbers */
for (var i = 0; i < formulaDescArray.length; i++) {
if (!isNaN(formulaDescArray[i])) {
formulaDescArray.splice(i, 1);
i--;
}
}
for (var i = 0; i < formulaDescArray.length; i++) {
if (!formulaDescInForm.contains(formulaDescArray[i].trim())) {
return false;
}
}
for (var i = 0; i < formula.length; i++) {
if (formula.charAt(i) == '(') {
bracketStack.push(formula.charAt(i));
} else if (formula.charAt(i) == ')') {
bracketStack.pop();
}
}
if (bracketStack.length != 0) {
return false;
}
return true;
}
- 拆分单词jquery
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 将字符串拆分为数组时出现JavaScript错误
- 在JavaScript中拆分日期字符串的更好方法是什么
- webpack代码拆分了handlerbs文件——结果是文件很大
- 如何将字符串拆分为字符,但在javascript中保留空格
- 简单地将拆分变量添加到对象中
- 换行符拆分返回“”;未定义”;
- 将字符串拆分为;只要它's不在»«
- JQuery Mobile Javascript复杂方程式
- 使用 JavaScript 拆分名字和姓氏
- Clear Case.如何在多行上拆分很长的javascript
- 在javascript中使用split函数希望在页面加载时拆分url
- Javascript和RegEx:拆分并保留分隔符
- 如何将日期拆分为格式化的日期和时间
- 如何将DIV标记的内容拆分为多个DIV
- 通过跳过拆分字符在 javascript 中拆分字符串
- 拆分文本节点
- 使用lodash下划线基于键拆分jsonarray
- 使用javascript中的数学方程式拆分变量