Javascript的正则expression式意外的输出

我正在尝试使用节点在css文件上执行一些正则expression式

这是我的javascript:

 var fs = require ('fs'); fs.readFile('test.css','utf8',function(error,css){ if(error){ console.log("I'm sorry, something went terribly wrong :o Here's the message: "+error); } var matches = css.match(/([a-zA-Z-]+):\s*([0-9]+)(vh|VH|vw|VW)/g); console.log(matches[2][1]); }); 

运行时的预期输出:

regex101输出

实际产出: 实际产出

正如你所看到的,它不会像预期的那样把每一个匹配放在自己的数组中,它只是把所有的东西放在一个没有任何子数组的巨型数组中。 我能做什么?

在这种情况下, match不会给你详细的比赛结果:

如果正则expression式包含g标志,则该方法返回包含所有匹配的子string而不是匹配对象的数组。

您可以使用exec来代替:

 var regex = /([a-zA-Z-]+):\s*([0-9]+)(vh|VH|vw|VW)/g; var css = "body{\nfont-size: 10vw;\n height: 500vh\n}"; var match; while (match = r.exec(css)){ console.log(match) } 

这给出了这个输出:

 ["font-size: 10vw", "font-size", "10", "vw", index: 6, input: "body{↵font-size: 10vw;↵ height: 500vh↵}"] ["height: 500vh", "height", "500", "vh", index: 24, input: "body{↵font-size: 10vw;↵ height: 500vh↵}"] 
 var reg = /([a-zA-Z-]+):\s*([0-9]+)(vh|VH|vw|VW)/g; var matches = []; var m; while ((m = reg.exec(css)) !== null) { if (m.index === reg.lastIndex) { reg.lastIndex++; } matches.push(m); } console.log(matches); 

这实际上是预期的行为。 如果使用带有全局标志的string.match方法,则括号不会在匹配内创build组:

 var str = "javascript is cool"; var result = str.match( /JAVA(SCRIPT)/g ); console.log( result[0] ); // javascript console.log( result.length ); //1 

你的情况是使用regexp.exec(str) 。 它可以find所有匹配和括号组。

 var str = 'javascript is cool. Use javascript'; var regexp = /java(script)/g; while (result = regexp.exec(str)) { console.log(result.length); //2 console.log(result[0]); //javascript console.log(result[1]); //script } 

基于上述的答案,我设法想出了以下代码:

 while(match = css.match(/([a-zA-Z-]+):\s*([0-9]+)(vh|VH|vw|VW)/)){ matches.push(match); css = css.replace(match[0],''); } 

谢谢大家帮助大家!