我有一个正则表达式
ysin(YX)
我需要插入*作为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);
此代码有什么问题。
答案 0 :(得分:2)
我建议在这种情况下使用常规的反向引用,因为您没有分析或操纵捕获组。问题是您尝试在)
之后使用/(\))([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);
答案 1 :(得分:0)
我使用函数列表作为锚并拆分变量列表来推广approch。正则表达式不区分大小写,并接受任何字母[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/>");