Regex匹配子字符串,但不匹配以单词为前缀的子字符串

Regex match substring, but not when prefixed by word

本文关键字:字符串 单词 前缀 Regex 不匹配      更新时间:2023-09-26

我有以下两行,它们代表了我处理的数据类型的示例,我目前正在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"]

有人能建议我该做什么吗?

在没有查找的情况下,您可以使用此基于交替的正则表达式,并使用捕获的组#1进行匹配:

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

RegEx演示

代码:

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"]