正则表达式:插入*使其可计算



我有一个正则表达式

ysin (y)

我需要插入*作为y*sin(y*x)

假设我的方程是yxsin(y)我需要得到y*x*sin(y)的输出我试过用这个代码

function addStars(str) {
    return str.replace(/())([A-Za-z])/g,function(str, gr1, gr2) { return gr1 + "*" + gr2 }).replace(/x([A-Za-wy-z])/g,function(str, gr1) { return "x*" + gr1 });
}
var t=addStars("ysin(yx)");
alert(t);

我建议在这种情况下使用常规的反向引用,因为您不需要分析或操纵捕获组。问题是,您正试图匹配)/())([A-Za-z])/g之后的一些字母-并且您在示例字符串ysin(yx)中没有)之后的任何文本。

这是一个可能的修复,我将xy合并到一个字符类中,并设置一个捕获组,以便能够在结果中恢复它们:

function addStars(str) {
       return str.replace(/([xy])([A-Za-xz])/g,"$1*$2");
//                         |    |                ^
//                         ----------------------|
}
var t=addStars("ysin(yx)");
document.write(t + "<br/>");
var t=addStars("yxsin(y)");
document.write(t);

我将这种方法一般化,使用函数列表作为锚点并拆分变量列表。regex不区分大小写,接受任何字母[a-z]作为函数的优先变量和参数。三角函数列表是(asin|acos|atan|sin|cos|tan)(也可以扩展,只记得把最长的函数名放在前面!)。

检查是否有用:

function addStars(str) {
    return str.replace(/([a-z]*?)(asin|acos|atan|sin|cos|tan)(([^)]*))/i, function(str, vars, funcName, args) { 
        return vars.split('').join('*') + '*' + funcName + '(' + args.split('').join('*')+')';});
}
var t=addStars("ysin(yx)");
document.write(t + "<br/>");
var t=addStars("yxsin(y)");
document.write(t + "<br/>");
var t=addStars("ycos(abyxz)");
document.write(t + "<br/>");
var t=addStars("yxatan(yxz)");
document.write(t + "<br/>");

最新更新