2

我复制并粘贴了一个大字符串的一小部分,并将其与大字符串匹配。但是,它不会返回值。在 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

以下是时间分割的内容。

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 :
4

2 回答 2

2

问题很微妙。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但我认为当子字符串匹配将完成你想要的事情时,这是矫枉过正的。

于 2013-10-15T18:21:44.210 回答
1

你也可以...

stringcomp.include? timestamp
于 2013-10-15T20:05:16.057 回答