我有一个表达说
日志(1,3)+ 4,5 + MAX(7,8,9)
其中逗号的使用方式有两种。
1-在“log(1,3)+4,5”逗号代替点(。)或十进制符号.i.e。 “ log(1,3)+4,5”相当于“ log(1.3)+4.5”。
2-在max(7,8,9)中,它被用作数字分隔符。即这个结果是9;最大数量。
我的问题是替换逗号;用作小数分隔符;带小数但不应影响max(7,8,9)。即我需要将上面的表达式转换为
日志(1.3)+ 4.5 + MAX(7,8,9)
我尝试了什么 -
function substitute(expr) {
expr.replace(/,/g, function ($`) {
/*some processing here to decide whether comma to be substituted with dot or not.On that basis I will return either dot or comma.*/
}
但是如何将$`值传递给相关函数 要么 是否可以在javascript中执行此操作。
expr.replace(/,/g,function ($`) {
如果是,那么如何?
答案 0 :(得分:1)
你的语言含糊不清。
max(8,1,8,2)
这会返回8
,8,1
还是8,2
?
您的语言也看起来不是常规,因此您无法使用正则表达式解析它,您需要上下文。如果允许这样的事情:
max(1,max(2,3)) // 3?
假设你可以摆脱歧义,你可以编写一个解析器来进行上下文检测。
答案 1 :(得分:0)
使用Javascript尝试以下内容。希望这有助于你的逻辑。
<强> DEMO HERE 强>
var value = "log(1,3)-4,5+max(7,8,9)";
var val = '';
var splitValue, appendSym;
if (value.indexOf("+") != -1)
{
splitValue = value.split("+");
appendSym = "+";
}
else if(value.indexOf("-") != -1)
{
splitValue = value.split("-");
appendSym = "-";
}
else if(value.indexOf("*") != -1)
{
splitValue = value.split("*");
appendSym = "*";
}
else
{
splitValue = value.split("/");
appendSym = "/";
}
var length = splitValue.length;
for (var i = 0; i < length; i++) {
if (val) val += appendSym;
var strrep = splitValue[i].replace(/,/g,".");
if (splitValue[i].indexOf("max") != -1 || splitValue[i].indexOf("min") != -1)
{
val+=splitValue[i];
}
else
{
val+=strrep;
}
}
alert(val);
上述代码的输出为log(1.3)-4.5+max(7,8,9)
答案 2 :(得分:0)
这可能是一个解决方案:
function myFilter(string) {
// save all functions and signs
var functions = [];
var regExp = /[+,-]max\(([^\)]+)\)/;
matches = true;
while (matches !== null) {
var matches = regExp.exec(string);
if (matches !== null) {
functions.push(matches[0]);
string = string.replace(matches[0], '');
}
}
// replace all remaining commas with dots
string = string.replace(/,/g , ".");
for (i in functions) {
string += functions[i];
}
return string;
}
var s = '1,3+4,5+max(7,8,9)-max(2,3,5)';
var filteredString = myFilter(s);
<强> jsFiddle Demo 强>
此功能目前适用于多个max
功能,但只有+
和-
个符号。它可以通过*
,/
等进行改进......你必须找到好的正则表达式。