问题很微妙。String.match
期望它的参数有一个正则表达式,如果它没有看到它,它会尝试将参数转换为一个表达式:
将模式转换为正则表达式(如果还不是),然后在 str 上调用其匹配方法。
所以:
created_at : Tue Jul 02 03:30:50 +0000 2013 id :
不是一种模式,它被转换为一种模式。
问题是+
. 在正则表达式中,+
表示前面的一个或多个字符或组或字符集。
在您和您新创建的模式之间指定文字匹配的正确方法是stringcomp
将模式设为:
created_at : Tue Jul 02 03:30:50 \+0000 2013 id :
注意\+
. 这意味着+
现在是文字值,而不是长度说明符。
对于视觉证明,请检查以下两个 Rubular 测试:
总而言之,简单的解决方法是不要尝试使用match
,而是使用子字符串搜索:
times = [
'Jul_01|created_at : Tue Jul 02 03:30:50 +0000 2013 id :',
'Jul_02|created_at : Tue Sep 03 05:08:44 +0000 2013 id :'
]
stringcomp = "created_at : Tue Jul 02 03:30:50 +0000 2013 id : 351905778745094144 id_str : 351905778745094144"
times.each do |t|
timestamp = t.split('|').last
puts stringcomp[timestamp] || 'sub-string not found'
end
哪个输出:
created_at : Tue Jul 02 03:30:50 +0000 2013 id :
sub-string not found
如果您想要一个布尔结果,而不是返回匹配的子字符串,您可以使用:
!!stringcomp[timestamp]
例如:
!!stringcomp['created_at : Tue Jul 02 03:30:50 +0000 2013 id :'] # => true
或者,你可以Regexp.escape
在你的字符串上使用它,然后再将它传递给,match
但我认为当子字符串匹配将完成你想要的事情时,这是矫枉过正的。