我正在尝试在javascript中编写正则表达式,以验证用户在评估之前是否输入了有效的BODMAS字符串



我试图呈现一个反应输入元素,可以在一个数字或一个字符串与BODMAS操作,如(5*3)+8和评估它。我想首先有效的BODMAS字符串所以我试图想出一个正则表达式来验证字符串是有效的,例如,它捕获了缺少括号的东西,如(5*3 +8

到目前为止我有两个表达式

const regex = /^(?:s*d+(?:s*[+*/-]s*d+)*s*)$/;

这个不会验证像(5+30)*8这样的东西而另一个

const regex2 = /^(*(d+(.d+)*|((d+(.d+)*|(*(d+(.d+)*|((d+(.d+)*|[+-/*]))*)*)*)*)*[+-/*]*)+)*$/

这个返回无效。我不熟悉正则表达式,我想我可能遗漏了一些东西。

最好的方法是使用解析器。

但是,如果您愿意,您可以迭代地简化输入字符串,直到没有更多的括号可以删除。

下面的代码片段是它的实现。用户的输入被实时验证:

function validate(expr) {
expr = expr.replace(/d+(.d+)?/g, "0")    // Simplify numbers to "0"
.replace(/s+/g, "")             // Remove white space
.replace(/B[+-]+(?=[0(])/g, "") // Remove unary operators (minus and plus)
.replace(/[+*/^-]/g, "-");      // Simplify binary operators to "-"
for (let i = expr.length + 1; i > expr.length; ) {
i = expr.length;
expr = expr.replace(/(0(-0)*)/g, "0"); // Remove inner parentheses
}
return /^0(-0)*$/.test(expr);
}
// I/O management
const input = document.querySelector("input");
const refresh = () => input.className = validate(input.value) ? "ok" : "error";
input.oninput = refresh;
refresh();
.error { background: orange }
.ok { background: lightgreen }
Expression: <input type="text">

对于解析表达式,使用分流码算法,可能会有一些扩展来支持函数和更多。

最新更新