JavaScript,RegExp-替换为包含标记表达式的计算表达式?

JavaScript,RegExp-替换为包含标记表达式的计算表达式?,javascript,regex,replace,evaluate,Javascript,Regex,Replace,Evaluate,RegExp可以用包含标记表达式的替换来替换匹配的模式 例如: var s = "... some string with full things..."; s = s.replace(/(some|full)/gi, "\"aw$1\"); 这将导致 '... "awsome" string with "awfull" things...' 生活是很酷的,因为一些和全部是匹配的,而替换字符串中的$1反映了大括号中匹配的标记表达式,在这种情况下,仅一些或全部 现在,我们有了这个想法- 我正在

RegExp可以用包含标记表达式的替换来替换匹配的模式

例如:

var s = "... some string with full things...";
s = s.replace(/(some|full)/gi, "\"aw$1\");
这将导致

'... "awsome" string with "awfull" things...'
生活是很酷的,因为一些全部是匹配的,而替换字符串中的$1反映了大括号中匹配的标记表达式,在这种情况下,仅一些全部

现在,我们有了这个想法- 我正在寻找一个想法来完成以下工作:

前的字符串:

"{timeOfEffect: 3*24*60*60 }"
紧跟

"{timeOfEffect: 259200}"
这些值是这样表示的,因为它们由人类编辑成可理解的术语,如(60秒*60分钟*24小时)*3=>3天(不要问客户的请求),但以计算机术语读取,如秒259200,并且可能包含许多这种模式的发生

我想尝试创建一个替换表达式,将$1和$2相乘,甚至将$1和$2传递给一个函数,或者将$1*$2传递给一个计算上下文,但我必须为它创建一个函数并手动执行

最接近的是

var x = /([0-9]*)\s\*\s([0-9]*)/g
  , r = function(m){
           return m[1] * m[2];
        }
while (m = x.exec(s))
  s = s.replace( x, r(m));
这有点糟糕,因为
exec
只返回第一个匹配项。 在replace语句中处理它之后-下一次搜索将从字符串的开头再次开始-这是一个长度为60K的字符串

一个好的解决方案将是以下之一: a) 从索引开始执行匹配(不为此创建新的子字符串) b) 提供允许计算的替换表达式

另一种方法是将字符串标记化,并以位的形式对其进行处理-这是需要大量代码和精力的
RegExp
的完全替代方法,在这种情况下,我将接受性能损失,或者为满足这一要求而在更好的替代方案上进行更好的斗争

有人帮忙吗

var str = '{timeOfEffect: 3*24*60*60}, {timeOfEffect: 1+7}, {timeOfEffect: 20-3}, {timeOfEffect: 3 / 0}';

var result = str.replace(/\s([\d\/\*\-\+\s]+?)\}/g, function(all, match) {
    return eval(match) + '}';
});

document.body.innerHTML = result;
// {timeOfEffect:259200}, {timeOfEffect:8}, {timeOfEffect:17}, {timeOfEffect:Infinity}

eval()
使用安全,因为我们已确保字符串仅包含
0-9
\n
\t
/
*
-
+
。可能有类似于
Math.parse()
的内容,但实际上没有


如果需要更复杂的需要括号的数学,只需将转义的
添加到正则表达式字符范围。

wow。这个很酷!对reg exp稍作调整-它涵盖了所有基本的算术道德规范(假设它们在语法上是正确的)!-拉达加斯特·布朗0秒前,editOk,这是最终的解决方案。它可以很容易地扩展到支持支架,但我不需要任何。最初报价的问题是,它也匹配简单的数字——不需要更换<代码>变量r=newregexp(([0-9\\.]+)([\\*+-\\/])([0-9\\*+-\\/]+)([0-9]),“g”)
r=function(m,m1,m2,m3,m4){
尝试{
返回:“+eval(m1+m2+m3+m4)
}catch(ex){
return:\”@@eval\u错误:“+m1+m2+m3+m4+”
输出显然是针对错误检查的。”并发送有关损坏配置的邮件。。。谢谢:)嘿,基威尔!match函数的前最后一个参数是搜索字符串中的匹配索引,最后一个参数是整个搜索字符串本身!!而且他妈的快!我可以使用它向编辑器发出准确的解析错误!!:)
var s = "timeOfEffect: 3*24*60*60 var: 6*8 ";
var r = new RegExp("([0-9*+-/]{0,}[0-9])","g");
s = s.replace(r,function(match){ return eval(match); });
alert(s)