正则表达式匹配子字符串,但不是以字为前缀

时间:2015-12-18 20:47:07

标签: javascript regex lookbehind

我有以下两行代表我处理的数据类型的示例,我目前正在regex101.com和Google Chrome控制台中测试。完成后我希望在Javascript应用程序中使用正则表达式。逻辑基本上与正则表达式匹配,除非它以' Note'为前缀,其中基本正则表达式是/([0-9]。[0-9] + [AZ]? )/"

General Note 5.32 5.34 5.36
abcdef 5.33

它应该匹配5.34,5.36和5.33。

这个正则表达式有效(使用负面的lookbehind),但在Javascript中无法使用:

/(?<!Note )\b([0-9]\.[0-9]+[A-Z]?)/g

基于其他Stack Overflow答案,我试图将其转换为可以在Javascript中运行的东西,但我最接近的是:

/^(?!Note).+\b([0-9]\.[0-9]+[A-Z]?)/g

在网站上,我看到这与5.34匹配,但不是5.33或5.36。

在Chrome控制台中试用:

text = 'General Note 5.32 5.34 5.36\nabcdef 5.33';
text.match(/^(?!Note).+\b([0-9]\.[0-9]+[A-Z]?)/g)

然后我得到以下内容,这也不是我想要的内容:

["General Note 5.32 5.34 5.36"]

有人可以建议我应该做什么吗?

1 个答案:

答案 0 :(得分:1)

如果没有lookbehind,您可以使用此基于交替的正则表达式并使用捕获的组#1 进行匹配:

/\bNote \b\d\.\d+[A-Z]?\b|\b(\d\.\d+[A-Z]?)\b/g

RegEx Demo

<强>代码:

var re = /\bNote \b\d\.\d+[A-Z]?\b|\b(\d\.\d+[A-Z]?)\b/g; 
var str = 'General Note 5.32 5.34 5.36\nabcdef 5.33';
var m;
var matches = [];

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex)
        re.lastIndex++;
    if (m[1])
       matches.push(m[1]);
}

console.log(matches);
//=> ["5.34", "5.36", "5.33"]