2016-04-15 69 views
1

我需要应用大量的具有多个反向引用的PCRE正则表达式,并在节点JS应用中应用perl样式转换s/\/\/(\d+)/$1/s节点JS PCRE正则表达式和变换支持

我寻找了一圈,发现此目的这两个库:

https://github.com/mscdex/node-pcre(正则表达式的应用程序)

https://github.com/tokuhirom/node-perl(Perl的风格变换)

安装过程中,我得到了很多NPM错误Node v5.9.0中的这些模块。

的节点PCRE库有一个issue它说的图书馆服务站将于V8 API改变

我跑进节点-perl的库安装问题,以及0.10的NodeJS版本之后的工作。

有没有办法让我得到了PCRE正则表达式的支持,并在节点v5.9.0转换

感谢

编辑:下面一个意见之一是指定在尝试这做一个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 
+0

由于什么原因Javascript正则表达式不足? –

+0

正则表达式都是在PCRE中写的。我需要在我的应用程序中使用它们 –

+1

除非这些正则表达式使用特殊的PCRE功能,否则它们中的大多数应直接与Javascript正则表达式引擎以及其他几乎没有更改的其他应用程序一起使用。 –

回答

0

曾与

sudo npm install perl 
sudo npm install pcre 

我。可能绑定/链接系统库需要sudo/root权限。 上面的命令为我做了诀窍。

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

1

在你给了,你使用的命名组,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; }); 
  1. 找出与您的外部$#声明中提到的组。记住它是哪一个。

  2. 你需要算的捕捉组,并重命名为((?P<NAME>))和无名()

    • ([abc])(?:[efg])(?P<NAME>[hij])记住,这里[abc]为1,[hij]是2,因为(?:)是不可捕捉。
  3. 然后,找到名为捕获(\g<NAME>)任何引用,并\#,其中#是最后一步的编号替换。

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

+0

感谢您的建议。但是,我没有控制正则表达式。正则表达式来自另一个团队/系统维护的数据库。有可能直接在javascript中使用这些正则表达式。 –

+0

@alpha_cod JS不使用PCRE,所以它不会那么容易。你可以使用像[this]这样的库(https://www.npmjs.com/package/pcre-to-regexp),(尽管在线测试者似乎已经被破坏)。这似乎正是你需要的。 – Laurel

+0

我明白..我想知道是否有任何方法可以获得上述模块 node-pcre和node-perl与NodeJS v5.9.0一起使用。这将解决我的用例.. –