Ruby string.match()函数在要匹配的字符串中失败并且具有相同的字符串

时间:2013-10-15 17:51:58

标签: ruby string-matching

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

2 个答案:

答案 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