我正在尝试使用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#中那样#
注意: 我意识到这些类型的面粉中有几种需要单独转换,但我仍然想知道如何做到这一点。
答案 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]等访问组。 这里有一些工作代码可以帮助您入门:
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;
}