2016-04-15 67 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一起使用。這將解決我的用例.. –