Regex 用于键/值匹配的高效正则表达式

Regex 用于键/值匹配的高效正则表达式,regex,Regex,假设我有一个字符串,它表示一组唯一的键/值对,如下所示: a:1;b:2;c:3;d:4 直接检查字符串是否包含特定的键/值对。但假设我想利用钥匙是唯一的这一事实。有没有一种方法可以优化正则表达式,这样如果它找到一个值与我想要的值不同的键,它会立即失败,而不是继续扫描到字符串的末尾 因此,在上面的示例中,如果我想查看b:3是否在字符串中,我希望匹配在找到b:2后立即失败。(注意:对像b:[^3]这样的东西进行反向搜索对于缺少b键的情况不起作用)我认为最快的方法是使用两步搜索法。我不知道您使用的

假设我有一个字符串,它表示一组唯一的键/值对,如下所示:

a:1;b:2;c:3;d:4
直接检查字符串是否包含特定的键/值对。但假设我想利用钥匙是唯一的这一事实。有没有一种方法可以优化正则表达式,这样如果它找到一个值与我想要的值不同的键,它会立即失败,而不是继续扫描到字符串的末尾


因此,在上面的示例中,如果我想查看
b:3
是否在字符串中,我希望匹配在找到b:2后立即失败。(注意:对像
b:[^3]
这样的东西进行反向搜索对于缺少
b
键的情况不起作用)

我认为最快的方法是使用两步搜索法。我不知道您使用的是什么编程语言(所以这是伪代码),但请使用以下正则表达式:

b:(\d)
这将在字符串中找到第一个
'b:
,并将
值保存为
组1
。现在检查
组1
中的值是否为您想要的值

例如,在JavaScript中,您可以执行以下操作:

var text = 'a:1;b:2;c:3;d:4';
var match = text.match(/b:(\d)/);
if (match[1] === '3')
{
    return true;
}
else
{
    return false;
}
这将是一个非常快速的方法。

^[^b]*b:3

说明:
断言匹配从使用
^
的行开始可以保证一行只包含一个匹配项。 使用
[^b]*
将匹配项扩展到“b”的第一个匹配项,并终止扩展,因为不允许它移过该匹配项。
最后,对
b:3
的评估要么验证匹配,要么使匹配无效,没有重新评估或回溯的机会,因为唯一的量词被终止了

类似的事情可能会起作用:

import re 

for dic in [{"a":1},{"b":2}]:   
    for  k,v in dic.items():
        regex = r".+?;%s:[^%d]" %(k,v)
        if re.match(regex, test): break

不过,这不会降低复杂性,假设位置是随机的,复杂性将是相同的。请使用先行断言
^(?。*b:[^3])。*b:3