2016-04-15 10 views
1

Ich habe eine Menge von PCRE Regexes mit mehreren Rückverweisungen anwenden und Perl-Transformationen s/\/\/(\d+)/$1/s in einer Node JS-App anwenden.Node JS PCRE regex und transformiert Unterstützung

Ich suchte herum und fand diese beiden Bibliotheken zu diesem Zweck:

https://github.com/mscdex/node-pcre (Regex Anwendung)

https://github.com/tokuhirom/node-perl (Perl-Stil verwandelt)

Ich habe viel von NPM Fehler bei der Installation immer dieser Module in Node v5.9.0.

Die Knoten-PCRE-Bibliothek hat ein issue, die die Bibliothek nicht mehr funktioniert nach NodeJS 0,10 Version sagt wegen in V8-API ändern

ich in Probleme bei der Installation für die Knoten-perl Bibliothek lief auch.

Gibt es eine Möglichkeit für mich, die Unterstützung für PCRE reguläre Ausdrücke zu bekommen und verwandelt sich in Knoten v5.9.0

Dank

EDIT: Einer der Kommentare war unten eine PCRE regex angeben, die versuchen, die am tut nicht in Javascript arbeiten. Hier ist das Beispiel:

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); 

Antwort

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

aus welchem ​​Grund Javascript Regexes nicht ausreichen? –

+0

Die Regexe wurden alle zuvor in PCRE geschrieben. Ich habe eine Notwendigkeit, wo ich sie in meiner App verwenden müssen –

+1

Außer wenn diese Regexes spezielle PCRE-Funktionen verwenden, sollten die meisten von ihnen direkt mit der Javascript Regex-Engine arbeiten, und die anderen mit wenigen Änderungen. –

Antwort

0

Arbeitete mit

sudo npm install perl 
sudo npm install pcre 

für mich. Wahrscheinlich erfordert das Binden/Verknüpfen mit sys libs sudo/root-Berechtigungen. Die obigen Befehle haben den Trick für mich getan.

Wenn also jemand diese Module auf dem neusten, über nvm verwalteten Knoten installieren muss, installieren Sie einfach diese Module mit sudo und dem Rest der Abhängigkeiten wie gewohnt ohne sudo.

1

In der regex Sie gab, verwenden Sie benannten Gruppen, die JS nicht unterstützt. Aus diesem Grund müssen Sie nummerierte Gruppen verwenden, die in diesem Fall die gewünschte Aufnahme an $2 senden.

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

Es sollte so funktionieren:

matchStr = page.replace(re, function (match, $2) { return $2; }); 
  1. die Gruppe mit externer $#-URL finden. Erinnere dich, welcher es ist.

  2. Hier finden Sie die Capture-Gruppen, die beide den Namen ((?P<NAME>)) und unbenannte ()

    • ([abc])(?:[efg])(?P<NAME>[hij]) Denken Sie daran, hier zählen müssen [abc] 1, und [hij] ist 2, weil (?:) nicht Capturing ist.
  3. Dann finden Sie alle Verweise auf die genannten Aufnahmen (\g<NAME>) und ersetzen mit \#, wo # die Nummer aus dem letzten Schritt.

  4. Ändern Sie die $# s in Ihrem JS-Code, nachdem Sie die neue Nummer für die im ersten Schritt gefundene Gruppe erhalten haben.

+0

Danke für Ihren Vorschlag. Allerdings habe ich keine Kontrolle über die Regexe. Die Regexe werden aus einer Datenbank gespeist, die von einem anderen Team/System verwaltet wird. Wäre es möglich, diese Regex direkt in Javascript zu verwenden? –

+0

@alpha_cod JS verwendet PCRE nicht, also wird es nicht so einfach sein. Sie könnten eine Bibliothek wie [this] (https://www.npmjs.com/package/pcre-to-regexp) verwenden (obwohl der Online-Tester kaputt zu sein scheint). Es scheint genau das zu sein, was du brauchst. – Laurel

+0

Ich verstehe .. Ich möchte wissen, ob es eine Möglichkeit gibt, die oben genannten Module Knoten-pcre und Node-Perl arbeiten mit NodeJS v5.9.0. Das würde meinen Anwendungsfall lösen. –