我复制并粘贴了大字符串的一小部分,并将其与大字符串相匹配。但是,它不会返回值。在NOT情况下,它返回true。我缺少匹配功能的东西,或者是否有隐藏的字符?
times = File.readlines('timesplit')
stringcomp = "created_at : Tue Jul 02 03:30:50 +0000 2013 id : 351905778745094144 id_str : 351905778745094144"
times.each do |t|
r = t.split('|')
timestamp = r[1]
puts !stringcomp.match(timestamp)
puts stringcomp.match(timestamp)
end
以下是timesplit的内容。
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 :
答案 0 :(得分:2)
问题很微妙。 String.match
期望其参数有一个正则表达式,如果它没有看到它,它会尝试将参数转换为表达式:
将模式转换为Regexp(如果它不是一个),然后在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
,但我认为当子字符串匹配完成你想要的东西时,这是过度的
答案 1 :(得分:1)
你也可以......
stringcomp.include? timestamp