我有一个正则表达式字符串,它从这样的CSS代码获取值

body {
  background: #000;
}
/* drapeDecalage: 10px */


我想解析注释的drapeDecalage值。
为此,我使用了正则表达式,并做了如下表达式:

(?<=\/\* drapeDecalage: )(.*?)(?=px \*\/)


wich在PHP中可以完美地工作,但是在Javascript中却不能,我遇到了这个错误

Uncaught SyntaxError: Invalid regular expression: /(?<=\/\* drapeDecalage: )(.*?)(?=px \*\/)/: Invalid group


使用此代码:

var re = /(?<=\/\* drapeDecalage: )(.*?)(?=px \*\/)/;
var str = '/* drapeDecalage: 10px */';

console.log(re.exec(str));


使用PHP PCRE https://regex101.com/r/nL2yX9/2在Regex101上演示

JSFiddle处的JavaScript代码演示:https://jsfiddle.net/wd574aw3/

怎么了?如何解决?

谢谢

最佳答案

事实上,当前的JavaScript正则表达式引擎不支持向后搜索(完全不知道是否/何时将支持)。

因此,您需要从PHP模式中删除后向(?<=部分)并仅与该子模式匹配,然后从第一个捕获组(由(.*?)捕获)中获得所需的值:

/\/\* drapeDecalage: (.*?)(?=px \*\/)/


demo



var re = /\/\* drapeDecalage: (.*?)(?=px \*\/)/;
var str = 'body {\n  background: #000;\n}\n/* drapeDecalage: 10px */';
if ((m = re.exec(str)) !== null) {
   document.body.innerHTML = m[1]; // m[1] contains the drapeDecalage value
}





请注意,您可以使用\s*代替零个或多个空格,而不是文字空格。

另外,如果您知道px */之前只有数字,则可以使用(\d+)代替(.*?)(当已知数据类型时,惰性点匹配模式不是最好的构造)。

因此,另一种正则表达式如下所示:

/\/\*\s*drapeDecalage:\s*(\d+)(?=px\s*\*\/)/


请参见regex demo

10-05 20:44
查看更多