我有一个正则表达式字符串,它从这样的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