【问题标题】:Node JS PCRE regex and transforms supportNode JS PCRE 正则表达式和转换支持
【发布时间】:2016-04-18 17:24:17
【问题描述】:

我需要应用大量具有多个反向引用的 PCRE 正则表达式,并在 Node JS 应用程序中应用 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 正则表达式和转换的支持

谢谢

编辑:下面的 cmets 之一是指定一个正在尝试的 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

【问题讨论】:

  • 为什么 Javascript 正则表达式不够用?
  • 之前的正则表达式都是用PCRE编写的。我需要在我的应用中使用它们
  • 除非这些正则表达式使用特殊的 PCRE 功能,它们中的大多数应该直接与 Javascript 正则表达式引擎一起使用,而其他的则只需少量更改。
  • @alpha_cod:你能分享一下正则表达式吗?
  • 示例正则表达式:name=\"itemId\"\svalue=\"(?P[\ w\-]+)\"[^.*?) 使用此 PCRE 功能:regular-expressions.info/named.html

标签: regex node.js npm pcre npm-install


【解决方案1】:

在您提供的正则表达式中,您使用的是 JS 不支持的命名组。因此,在这种情况下,您需要使用编号组,这会将您想要的捕获推送到 $2

&lt;input type=\"hidden\"\s*name=\"itemId\"\s*value=\"([\w\-]+)\"[^&lt;]*&gt;.*?&lt;SCRIPT LANGUAGE=\'JavaScript\'[^&lt;]*&gt;.*?(\1Matrix\s*\=.*?&lt;\/SCRIPT&gt;)';

它应该像这样工作:

matchStr = page.replace(re, function (match, $2) { return $2; });
  1. 找到您的外部$# 语句中提到的组。记住是哪一个。

  2. 您需要计算已命名 ((?P&lt;NAME&gt;)) 和未命名 () 的捕获组

    • ([abc])(?:[efg])(?P&lt;NAME&gt;[hij]) 记住,这里 [abc] 是 1,[hij] 是 2,因为 (?:) 是非捕获的。
  3. 然后,找到对命名捕获 (\g&lt;NAME&gt;) 的所有引用并替换为 \#,其中 # 是上一步的数字。

  4. 在获得第一步找到的组的新号码后,更改 JS 代码中的$#s。

【讨论】:

  • 感谢您的建议。但是,我无法控制正则表达式。正则表达式来自另一个团队/系统维护的数据库。是否可以在javascript中直接使用这些正则表达式。
  • @alpha_cod JS 不使用 PCRE,所以不会那么容易。您可以使用this 之类的库(尽管在线测试仪似乎已损坏)。这似乎正是您所需要的。
  • 我明白.. 我想知道是否有任何方法可以让上述模块 node-pcre 和 node-perl 与 NodeJS v5.9.0 一起使用。那将解决我的用例..
【解决方案2】:

合作过

sudo npm install perl
sudo npm install pcre

对我来说。可能与 sys 库绑定/链接需要 sudo/root 权限。 上面的命令对我有用。

因此,如果其他人需要在通过 nvm 管理的最新节点上安装这些模块,只需像往常一样使用 sudo 安装这些模块,其余依赖项不使用 sudo。

【讨论】:

    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    相关资源
    最近更新 更多