【发布时间】:2015-02-18 04:03:58
【问题描述】:
我有这些变量:
keywords = ["/(?=.*?\bTest1\b).*/i","/(?=.*?\bTest2\b)(?=.*?\bTest3\b).*(?m)^(?!.*?NotThis4)(?m)^(?!.*?NotThis5).*$/i"]
hash = {"Test2 Test3 irrelevant1"=>"Mon, 16 Feb 2015 09:26:02 +0000", "Test2 Test3 NotThis4 irrelevant2"=>"Mon, 16 Feb 2015 09:24:01 +0000", "Test1 irrelevant3 irrelevant4"=>"Mon, 16 Feb 2015 09:23:02 +0000"}
我需要跑步:
keywords.each do |regex|
hash.select{ |k,_| k[regex]}
end
在此示例中,我尝试使用 "Test2 Test3 irrelevant1" 和 "Test1 irrelevant4 irrelevant5" 的键收集哈希值。不过,正则表达式不是我关心的问题。它使用正则表达式作为/在一个我无法理解的变量中。我尝试将\b 转义为\\b,但无济于事。
当我将变量设置为正则表达式时,如:
regex = "/(?=.*?\bTest2\b)(?=.*?\bTest3\b).*(?m)^(?!.*?NotThis4)(?m)^(?!.*?NotThis5).*$/i"
代码:
hash.select{ |k,_| k[regex]}
不工作。
但如果我用实际的文字表达式替换变量:
hash.select{ |k, _| k[/(?=.*?\bTest2\b)(?=.*?\bTest3\b).*(?m)^(?!.*?NotThis4)(?m)^(?!.*?NotThis5).*$/i]}
效果很好。
此外,该功能也适用于文字字符串变量:
regex = "Test1"
hash.select{ |k, _| k[regex]}
以及文字字符串本身:
hash.select{ |k, _| k["Test1"]}
如何在变量中使用正则表达式,功能位于顶部?再次强调:
keywords.each do |regex|
hash.select{ |k,_| k[regex]}
end
正则表达式作为字符串接收:
keywords.map! do |array_lineitem|
builder = ""
last = ""
array_lineitem.each do |string_element|
if string_element[0] == "-"
string_element.sub!(/^-/, '')
last += "(?m)^(?!.*?" + string_element + ")"
else
builder += "(?=.*?\b" + string_element + "\b)"
end
end
if last.empty?
throwback = "/" + builder + ".*/i"
else
throwback = "/" + builder + ".*" + last + ".*$" + "/i"
end
end
将字符串转换为正则表达式,我尝试了to_regexp gem、Regexp.escape、Regexp.union 和 eval(string),但还是没有运气。 \b 使用这些方法中的每一个都转换为 \x08。
【问题讨论】:
-
请注意,如果您使用free-spacing mode,正则表达式会更容易阅读