gpt4 book ai didi

Ruby string.match() 函数失败,在要匹配的字符串中出现相同的字符串

转载 作者:数据小太阳 更新时间:2023-10-29 08:48:44 26 4
gpt4 key购买 nike

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

最佳答案

问题很微妙。 String.match期望它的参数有一个正则表达式,如果它没有看到一个正则表达式,它会尝试将参数转换为一个表达式:

Converts pattern to a Regexp (if it isn’t already one), then invokes its match method on 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

如果你想要一个 bool 结果,而不是返回匹配的子字符串,你可以使用:

!!stringcomp[timestamp]

例如:

!!stringcomp['created_at : Tue Jul 02 03:30:50 +0000 2013  id :'] # => true

或者,您可以在您的字符串上使用Regexp.escape,然后再将它传递给match,但我认为当子字符串匹配将完成您想要的。

关于Ruby string.match() 函数失败,在要匹配的字符串中出现相同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19387785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com