我需要在 Node JS 应用程序中应用大量具有多个反向引用的 PCRE 正则表达式,并应用 perl 样式转换 s/\/\/(\d+)/$1/s
。
我四处搜索并找到了这两个用于此目的的库:
https://github.com/mscdex/node-pcre (正则表达式应用程序)
https://github.com/tokuhirom/node-perl (Perl风格转换)
在 Node v5.9.0 中安装这些模块时,我遇到了很多 NPM 错误。
node-pcre 库有一个 issue其中表示由于 V8 API 的更改,该库在 NodeJS 0.10 版本之后停止工作
我也遇到了 node-perl 库的安装问题。
有没有办法让我在 Node v5.9.0 中获得 PCRE 正则表达式和转换的支持
谢谢
编辑:下面的评论之一是指定正在尝试的 PCRE 正则表达式,该表达式在 javascript 中不起作用。示例如下:
var fs = require("fs");
var regex = '<input type=\"hidden\"\s*name=\"itemId\"\s*value=\"(?P<sku>[\w\-]+)\"[^<]*>.*?<SCRIPT LANGUAGE=\'JavaScript\'[^<]*>.*?(\g{sku}Matrix\s*\=.*?<\/SCRIPT>)';
var page = fs.readFileSync("./page.html");
var re = new RegExp(regex);
var matchStr = "";
matchStr = page.replace(re, function (match, $1) { return $1; });
console.log(matchStr);
回应
SyntaxError: Invalid regular expression: /<input type="hidden"s*name="itemId"s*value="(?P<sku>[w-]+)"[^<]*>.*?<SCRIPT LANGUAGE='JavaScript'[^<]*>.*?(g{sku}Matrixs*=.*?</SCRIPT>)/: Invalid group
at new RegExp (native)
at Object.<anonymous> (/home/user/project/abc.js:7:10)
at Module._compile (module.js:413:34)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:142:18)
at node.js:939:3
最佳答案
在您提供的正则表达式中,您使用的是 JS 不支持的命名组。因此,您需要使用编号组,这会将您所需的捕获推至 $2
,在本例中。
<input type=\"hidden\"\s*name=\"itemId\"\s*value=\"([\w\-]+)\"[^<]*>.*?<SCRIPT LANGUAGE=\'JavaScript\'[^<]*>.*?(\1Matrix\s*\=.*?<\/SCRIPT>)';
它应该像这样工作:
matchStr = page.replace(re, function (match, $2) { return $2; });
查找外部提及的群组
$#
陈述。记住它是哪一个。您需要计算捕获组的数量,包括命名 (
(?P<NAME>)
) 和未命名()
。-
([abc])(?:[efg])(?P<NAME>[hij])
记住,这里[abc]
是 1,并且[hij]
是 2 因为(?:)
不捕获。
-
然后,找到对命名捕获 (
\g<NAME>
) 的任何引用并替换为\#
,其中#
是最后一步的数字。更改
$#
获取第一步中找到的群组的新号码后,在 JS 代码中添加 s 。
关于regex - Node JS PCRE 正则表达式和转换支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644248/