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