2016-04-15 6 views
1

私は、複数の後方参照を含む多くのPCRE正規表現を適用し、ノードJSアプリケーションでperlスタイルの変換s/\/\/(\d+)/$1/sを適用する必要があります。ノードJS PCREの正規表現と変換のサポート

私の周りを検索し、この目的のために、これらの2つのライブラリが見つかりました:

https://github.com/mscdex/node-pcre(正規表現の応用)

https://github.com/tokuhirom/node-perl(Perlのスタイルは変換)

私は、インストール時にNPMエラーの多くを取得していますこれらのモジュールはノードv5.9.0にあります。

ノード-PCREライブラリは、私もノード-perlのライブラリのインストールの問題に遭遇した

V8のAPIに変更することにより、NodeJS 0.10バージョンの後に作業ライブラリの停止を言うissueを持っています。

ですが、私はPCREの正規表現のサポートを取得し、ノードv5.9.0に変換

感謝するための方法

EDIT:コメントの一つは、下記んどのしようとしています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

。おそらく、sysのlibsとのバインド/リンクには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コードの$#を最初の手順で見つかったグループの新しい番号を取得した後に変更します。私のため

    sudo npm install perl 
    sudo npm install pcre 
    

    で働い

+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で動作しています。それは私のusecaseを解決するだろう.. –