RegExp 可以将匹配的模式替换为涉及标记表达式
的替换例子:
var s = "... some string with full things...";
s = s.replace(/(some|full)/gi, "\"aw$1\");
这将导致
'... "awsome" string with "awfull" things...'
而且生活很酷,因为 some 和 full 是匹配的,替换字符串中的 $1 反射(reflect)了大括号中匹配的 Tagged Expression ,在这种情况下 - 只有一些或全部。
现在,我们有了想法 - 我正在寻找执行以下操作的想法:
之前的字符串:
"{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
返回仅第一个匹配项。
在替换语句中处理它之后 - 下一次搜索再次从字符串的开头开始 - 这是一个 60K 长度的字符串......
一个好的解决方案将是以下之一: a) 从索引开始执行匹配(不为此创建新的子字符串) b) 提供一个允许求值的替换表达式
另一种方法是标记字符串,并以位为单位对其进行处理 - 这是 RegExp
的完全替代方法,它需要大量代码和精力,在这种情况下,我会只是忍受性能损失或为满足此要求的更好选择而进行更好的斗争......
帮助任何人?
最佳答案
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)
关于JavaScript,RegExp - 替换为涉及标记表达式的评估表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5191776/