我有一个正则表达式
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)
中没有)
之后的任何文本。
这是一个可能的修复,我将x
和y
合并到一个字符类中,并设置一个捕获组,以便能够在结果中恢复它们:
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/>");