我正在尝试为我的不和谐机器人制作完美的数学解析器。
当前,我有一个简单的函数解析器,它接收一个字符串,该字符串具有大量.replace
方法来清除一堆垃圾或格式化不和谐中遗留下来的东西,或者仅将{}替换为()以及如此生活质量的东西...
var parseArgs = args.toLowerCase().replace(/ -o/g, "").replace(/x/g, "*").replace(/[a-z]/g, "")
.replace(/{/g, "(").replace(/}/g, ")").replace(/\[/g, "(").replace(/]/g, ")").replace(/\+=/g, "+")
.replace(/-=/g, "-").replace(/'/g, "").replace(/`/g, "").replace(/"/g, "");
var origArgs = args.toLowerCase().replace(/`/g, "").replace(/ -o/g, "");
const output = parseMath(parseArgs);
一切都很好,但是如果输入这样的方程式:
!math 1 + 1aaa+aaaa2{55>>2}
解析器将输出:
1 + 1+2*(55>>2)
我希望它输出:
1 + 1 + 2 * (55 >> 2)
它很容易通过我的函数进行解析,但是方程式被发送到聊天中,而且非常难看。
我问是否有一个简单的正则表达式公式来检查数学运算符(+ - / * x ( ) >> ^ += -= == ===
)是否在任何数字之间
因此1+2/3(4>>2)
,3>>4===3*4
将分别变成1 + 2 / 3 (4 >> 2)
和3 >> 4 === 3 * 4
。
编辑:我看到我的替换是多么糟糕,所以我简化了它们:
var parseArgs = args.toLowerCase().replace(/x/g, "*").replace(/ -o|[a-z]|"|'|`/g, "")
.replace(/{|\[/g, "(").replace(/}|]/g, ")").replace(/\+=/g, "+").replace(/-=/g, "-");
var origArgs = args.toLowerCase().replace(/ -o|`/g, "");
首先删除所有非数学的内容(删除所有不是数字或可能的运算符的内容),然后使用.replace
来匹配零个或多个空格,然后使用任何运算符,然后再次匹配零个或多个空格,并替换为运算符,每边各留一个空格:
const parse = (args) => {
const argsWithOnlyMath = args.replace(/[^\d+\-\/*x()>^=]/g, ' ');
const spacedArgs = argsWithOnlyMath
.replace(/\s*(\D+)\s*/g, ' $1 ') // add spaces
.replace(/ +/g, ' ') // ensure no duplicate spaces
.replace(/\( /g, '(') // remove space after (
.replace(/ \)/g, ')'); // remove space before )
console.log(spacedArgs);
};
parse('!math 1 + 1aaa+aaaa2(55>>2)');
parse(' 1+2/3(4>>2) ');
parse('3>>4===3*4');
要在之前(
和之后添加空格)
,只需添加more .replace
:
const parse = (args) => {
const argsWithOnlyMath = args.replace(/[^\d+\-\/*x()>^=]/g, ' ');
const spacedArgs = argsWithOnlyMath
.replace(/\s*(\D+)\s*/g, ' $1 ') // add spaces
.replace(/\(/g, ' (') // add space before (
.replace(/\)/g, ') ') // add space after )
.replace(/ +/g, ' ') // ensure no duplicate spaces
.replace(/\( /g, '(') // remove space after (
.replace(/ \)/g, ')'); // remove space before )
console.log(spacedArgs);
};
parse('!math 1 + 1aaa+aaaa2(55>>2)');
parse(' 1+2/3(4>>2) *()');
parse('3*()');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句