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

标签 javascript regex lookbehind

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

General Note 5.32 5.34 5.36
abcdef 5.33

它应该匹配 5.34、5.36 和 5.33。

此正则表达式有效(使用负向回顾),但在 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"]

谁能建议我应该做什么?

最佳答案

在没有 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"]

关于javascript - 正则表达式匹配子字符串,但不是以单词为前缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34363718/

相关文章:

javascript - 带有触发点击的 fancybox 错误

javascript - 正则表达式更改函数名称和字符串参数

regex - 正则表达式中 "lookbehind assertion MUST be fixed length"的技术原因是什么?

javascript - 如何将此正则表达式转换为不使用 Lookbehind?

javascript - 在javascript中为对象设置变量

javascript - 在 Node 中使用 promise 循环返回相同的响应

javascript - 寻找一个正则表达式来解析JS的参数字符串

regex - Bash - 如何将每一行放在引号内

javascript - 构建此 JavaScript 正则表达式的困难

javascript - 从 glassfish 服务器日志上的 javascript 函数打印 JSON 对象