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

时间:2018-11-07 17:11:14

标签: regex

比方说,我有一个字符串,表示一个唯一键/值对的列表,如下所示:

a:1;b:2;c:3;d:4

直接检查字符串是否包含特定的键/值对。但是,假设我想利用密钥是唯一的事实。有没有一种方法可以优化正则表达式,以便如果它找到一个与我想要的值不同的键,则它立即失败,而不是继续扫描到字符串的末尾?

因此,在上面的示例中,如果我想查看字符串中是否b:3,则希望匹配一发现b:2就失败。 (请注意:对于缺少b:[^3]键的情况,对b之类的反向搜索将不起作用)

3 个答案:

答案 0 :(得分:0)

我认为最快的方法是采用两步法。我不知道您使用的是哪种编程语言(所以这是pseudicode),但是使用此正则表达式:

b:(\d)

这将在字符串中找到第一个'b:',并将value保存为Group 1。现在,检查Group 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;
}

这将是一种非常快速的方法。

答案 1 :(得分:0)

DEMO

^

说明:
[^b]*声明匹配从行的开头开始,以确保一行将完全包含一个匹配。 使用b:3可将匹配项扩展到第一个出现的'b'并终止扩展,因为不允许将其移到该位置。 最后,['New Jersey ; 46.3% ; Republican ; 03/10/2015', 'Pennsylvania ; 39.0%; Democrat ;04/30/2012', 'Virginia . ;54.7% ;Independent ;10/25/10', 'Maryland;44.8% ; Democrat; 01/15/16', 'New York; R50.9%; Republican ; 09/22/15'] 的评估会验证匹配结果是否有效或无效,因为唯一的量词被终止,因此没有重新评估或回溯的机会

答案 2 :(得分:0)

类似的事情可能起作用:

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