Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中对匹配执行操作_Javascript_Regex_Match - Fatal编程技术网

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

如何在javascript中对匹配执行操作,javascript,regex,match,Javascript,Regex,Match,我试图使用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 &

我试图使用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;
    }
我想把它和正则表达式按照

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

注:
我意识到有几种面粉需要单独转换,但我还是想知道如何转换

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

为了达到同样的效果,您可以使用Regex#exec方法在字符串中循环。因此,与其这样做,不如:

myString.match(myRegex);
其中myRegex具有“g”修饰符。你可以这样做:

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

多亏了Regex对象的属性,您将循环遍历字符串并最终返回null。

您可以这样做。听起来您想使用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”字符串执行所需的操作


我希望这会有帮助如果我遗漏了要点,请评论以澄清您是否需要。

您不能使用
match
函数和全局正则表达式访问组。在这种情况下,您可以使用
exec
而不是
match
,也可以不使用
g
将文本拆分成几行,并在每一行上使用
match
(我选择第二种方法,但这取决于您的输入是如何组织的)

如果不使用全局正则表达式,则可以使用m[1]、m[2]等访问组。 以下是一些可以帮助您开始的工作代码:

var a=[
[/([0-9\/]+)(杯)?(全麦|普通|白|浓|自养)?(面粉)/i,45,“g”,
];
函数转换(){
var t=document.getElementById(“输入”).innerHTML;
对于(var j=0;j
t.replace(/(([0-9\/]+) ((wholemeal |plain |white |strong |self-raising )?flour))/ig,'$1');
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;
}