Rad*_*own 4 javascript regex replace evaluate
RegExp可以替换匹配的模式,替换涉及所谓的标记表达式
例:
var s = "... some string with full things...";
s = s.replace(/(some|full)/gi, "\"aw$1\");
Run Code Online (Sandbox Code Playgroud)
这将导致
'... "awsome" string with "awfull" things...'
Run Code Online (Sandbox Code Playgroud)
生活很酷,因为一些和完全匹配,并且替换字符串中的$ 1反映了大括号中匹配的Tagged Expression,在这种情况下 - 恰好只有一些或全部.
现在,我们得到了这个想法 - 我正在寻找一个想法来做以下事情:
字符串之前:
"{timeOfEffect: 3*24*60*60 }"
Run Code Online (Sandbox Code Playgroud)
字符串之后
"{timeOfEffect: 259200}"
Run Code Online (Sandbox Code Playgroud)
这些值的表示方式是因为它们由人类编辑为可掌握的术语,如(60秒*60分钟*24小时)*3 => 3天(不要问.客户的要求),但读取计算机术语如259200 in秒,并且可能包含许多该模式.
我正在考虑尝试创建一个替换表达式,将$ 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));
Run Code Online (Sandbox Code Playgroud)
这很糟糕,因为只exec返回第一场比赛.在替换语句中处理后 - 下一次搜索从字符串的开头再次开始 - 这是一个长度为60K的字符串...
一个好的解决方案将是以下之一:a)从索引开始执行匹配(不为其创建新的子字符串)b)提供允许评估的替换表达式
另一种方法是对字符串进行标记化,并按比特处理它 - 这是一个完全替代RegExp它将需要大量的代码和努力,在这种情况下,我将忍受性能损失或给予更好的斗争关于这个要求的更好的选择......
帮助任何人?
小智 7
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)
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
eval()是安全的使用,因为我们已确保该字符串仅包含0-9,, \n,\t,/,*,-和+.我是希望有可能是类似Math.parse()的,但没有.
如果您需要更复杂的数学需要括号,只需将转义(并添加)到正则表达式字符范围.
| 归档时间: |
|
| 查看次数: |
3110 次 |
| 最近记录: |