比方说,我有一个字符串,表示一个唯一键/值对的列表,如下所示:
a:1;b:2;c:3;d:4
直接检查字符串是否包含特定的键/值对。但是,假设我想利用密钥是唯一的事实。有没有一种方法可以优化正则表达式,以便如果它找到一个与我想要的值不同的键,则它立即失败,而不是继续扫描到字符串的末尾?
因此,在上面的示例中,如果我想查看字符串中是否b:3
,则希望匹配一发现b:2就失败。 (请注意:对于缺少b:[^3]
键的情况,对b
之类的反向搜索将不起作用)
答案 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)
^
说明:
用[^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