Regex适用于浏览器,但不适用于Node.js

时间:2018-01-15 13:07:20

标签: javascript node.js regex

我有一个正则表达式:/(?<!\<)\<[a-zA-Z0-9. _]+\>/g。如果我"(<<a1>> * <b1> * <c1> * <d1>) * <<e1>>".match(/(?<!\<)\<[a-zA-Z0-9. _]+\>/g),则在浏览器控制台中正常工作。

在Node.js中执行时,同一行代码抛出SyntaxError: Invalid regular expression: /(?<!<)<([a-zA-Z0-9. _]+)>/: Invalid group

我希望匹配<>中所包含的字符串中的所有变量,如果<<>>括起来,请忽略它们。

2 个答案:

答案 0 :(得分:3)

作为答案(更多空间):
除非node.js使用自己的正则表达式引擎而不是JavaScript引擎,否则JS不支持lookbehinds,因此(?<!)无效。要在某种程度上模仿其他编程语言的此功能,请查看Flagrant Badassery或使用其他软件包,如node-re2node-perl-regex

至于浏览器之间的差异,Chrome does support lookbehinds

答案 1 :(得分:1)

您可以使用此正则表达式(可能需要稍作更改,具体取决于您是否要检测行的开头/结尾或这些子实体)。我在<>内的值附近添加了一个caturing组,因为此正则表达式还将匹配<之前和>之后的字符。

如果<>可以放在字符串的开头/结尾:

/(?:[^<]|^)\<([a-zA-Z0-9. _]+)\>(?:[^<]|$)/g

如果您不需要:

/(?:[^<])\<([a-zA-Z0-9. _]+)\>(?:[^<])/g

注意:不确定这一点,但可能比负面的背后更快。

编辑:根据您的评论,我不确定您是否知道捕获群组。它允许您提取正则表达式的部分内容,而不是整个匹配表达式的强制性。

要在Javascript中使用它们,请参阅此示例(请注意,您必须在正则表达式的开头和结尾删除/并为正则表达式对象转义\):

var myRegex = new RegExp('(?:[^<]|^)\\<([a-zA-Z0-9. _]+)\\>(?:[^<]|$)', 'g'), testStr = '(<<a1>> * <b1> * <c1> * <d1>) * <<e1>>', match, elem = document.getElementById('result');

while (match = myRegex.exec(testStr)) {
  elem.innerHTML = elem.innerHTML + match[1] + '<br>';
}
<div id="result"></div>