JavaScript,RegExp - 替换为涉及标记表达式的评估表达式?

标签 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...'

而且生活很酷,因为 somefull 是匹配的,替换字符串中的 $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/

相关文章:

javascript - 如何抑制javascript异常?

javascript - 尝试使用 ECMAScript 正则表达式获取不存在字符串的数据子集

sql - 在更新命令 DB2 中使用替换

windows - 如何用行号替换任何行?

regex - 需要一个仅匹配管道字符的单个实例的正则表达式

replace - 使用 VBscript 在 .txt 文件中查找和替换字符串

javascript - 在 Javascript 中显示数据库图像

javascript - Ionic 保持指令

javascript - 使用 JavaScript(不是 JQuery!)淡化图像

regex - 按其他节点值的模式分组的节点值求和