0

我正在尝试使用 javascript(纯 js,而不是 jquery 或库)通过正则表达式匹配项目并对它们执行操作。

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

    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# 中那样找到访问匹配组的方法

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

4

3 回答 3

2

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

借助 Regex#exec 方法,您可以做些什么来获得相同的效果,从而遍历您的字符串。所以,而不是这样做:

myString.match(myRegex);

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

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

感谢 Regex 对象的lastIndex属性,您将遍历字符串并最终返回 null。

于 2013-04-07T20:43:44.897 回答
0

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

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

现在,使用该匿名函数,您可以更精确地对匹配的组进行操作。

如果这没有帮助,您是否知道“$ 1-9”结构?例如

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

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

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

于 2013-04-07T20:45:46.457 回答
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;
}
于 2013-04-07T21:28:08.637 回答