我有一个正则表达式:/(?<!\<)\<[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
。
我希望匹配<
和>
中所包含的字符串中的所有变量,如果<<
和>>
括起来,请忽略它们。
答案 0 :(得分:3)
作为答案(更多空间):
除非node.js
使用自己的正则表达式引擎而不是JavaScript
引擎,否则JS
不支持lookbehinds,因此(?<!)
无效。要在某种程度上模仿其他编程语言的此功能,请查看Flagrant Badassery或使用其他软件包,如node-re2
或node-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>