如何在javascript中对匹配执行操作

时间:2013-04-07 19:17:57

标签: javascript regex match

我正在尝试使用javascript(普通js,而不是jquery或库)来匹配regex的项目并对它们执行操作。

基本上我正在尝试创建一个从Imperial测量值转换为metric的脚本。这就是我所拥有的

    var a = [
            [/([0-9\/]+) (pound[s]?|lb)/ig, 45, "g"],
        ];
    function convert(){
        var t = document.body.innerHTML;
        for(var j = 0; j < a.length; j++){
            var m = t.match(a[j][0]);
            for(var i = 0; i < 1; i++){
                var decimal = eval(m[i].split(' ')[0]);
                t = t.replace(m[i],(decimal * a[j][1]) + a[j][2]);
            }
        }
        document.body.innerHTML = t;
    }

这有效,但对于某些比赛,我想返回比赛的一部分。例如,有一杯糖和一杯面粉的转换,但每种都有很多类型,所以我想返回原始字符串的一部分。

如果我有

1 cup wholemeal flour

我希望将此与正则表达式相匹配

/(([0-9\/]+) ((wholemeal |plain |white |strong |self-raising )?flour))/ig

...仅在第一部分上操作,并用包含令牌的字符串替换整个批次,例如

            //match  value   * conversion  + unit    + string token
t - t.replace(m[i], (decimal * a[j][1])    + a[j][2] + m[i][2]);

最后以

结束
150g wholemeal flour

然而,m [i]是一个字符串,我无法找到一种方法来访问匹配中的组,就像我在php或c#中那样#

注意: 我意识到这些类型的面粉中有几种需要单独转换,但我仍然想知道如何做到这一点。

3 个答案:

答案 0 :(得分:2)

由于“g”修饰符,您无法访问您的组(当JavaScript完全支持嵌套结构时,仍然不知道为什么不能这样做。)。

由于Regex #exec方法,你可以做些什么才能产生相同的效果。所以,而不是做:

myString.match(myRegex);

其中myRegex具有“g”修饰符。你可以这样做:

var match;
while(match = myRegex.exec(myString)) {
  // do stuff here...
}

感谢Regex对象的lastIndex属性,你将循环遍历字符串,最后返回null。

答案 1 :(得分:0)

你可以这样做。听起来你想要使用javascript替换函数的“回调”功能,例如:

t.replace(m[i],function(match, contents, offset, fullstring){ 
return (decimal * a[j][1])    + a[j][2] + m[i][2])
});

现在使用匿名功能,您可以更精确地操作匹配的组。

如果这没有帮助,您是否知道'$ 1-9'构造? e.g。

t.replace(/(([0-9\/]+) ((wholemeal |plain |white |strong |self-raising )?flour))/ig,'$1');

这将仅用第一个括号内组'(xxx)'中的内容替换每个组。然而,这些也是PHP的标准。您可以在'$ 1'字符串上进一步执行所需的操作。

我希望它有所帮助! - 如果我错过了这一点,请评论澄清你是否愿意。

答案 2 :(得分:0)

您无法使用match功能和全局正则表达式访问组。在这种情况下,您可以使用exec代替match,也可以不使用g并将文本拆分为行,并在每行使用match(我会转到第二种方法,但这取决于你的输入是如何组织的)

如果您没有使用全局正则表达式,则可以使用m [1],m [2]等访问组。 这里有一些工作代码可以帮助您入门:

http://jsfiddle.net/TCVDx/5/

var a = [
  [/([0-9\/]+) (cup )?(wholemeal|plain|white|strong|self-raising)? (flour)/i, 45, "g"],
];

function convert(){
  var t = document.getElementById("input").innerHTML;

  for(var j = 0; j < a.length; j++){
    var m = t.match(a[j][0]);
    var decimal = eval(m[0].split(' ')[0]);
    t = (decimal * a[j][1]) + " " + a[j][2] + " " + m[3] + " " + m[4];
  }
  document.getElementById("output").innerHTML = t;
}