RUBY:将变量设置为数组元素,正则表达式认为它是数组

RUBY:将变量设置为数组元素,正则表达式认为它是数组,ruby,regex,arrays,string,match,Ruby,Regex,Arrays,String,Match,我试图从一个字符串中正则化一个字符,该字符串是从扫描结果的元素中分配的。我试图使用match,它抱怨变量是数组。我不明白为什么“垃圾桶”被视为一个数组 test = 'class="date">B=oddTu Q=' array = test.scan(/([A-Z])=/) puts array trash = array.last trash.to_s puts trash if /Q/.match(trash) puts $1 end 这就是我看到的结果 C:\Ruby>

我试图从一个字符串中正则化一个字符,该字符串是从扫描结果的元素中分配的。我试图使用match,它抱怨变量是数组。我不明白为什么“
垃圾桶
”被视为一个数组

test = 'class="date">B=oddTu Q='
array = test.scan(/([A-Z])=/)
puts array
trash = array.last
trash.to_s
puts trash
if /Q/.match(trash)
  puts $1
end
这就是我看到的结果

C:\Ruby>scratch.rb
class="date">B=oddTu Q=
B
Q
Q
C:/Ruby/scratch.rb:14:in match: can't convert Array to String (TypeError)
        from C:/Ruby/scratch.rb:14:in `<main>'
C:\Ruby>scratch.rb
class=“日期”>B=Q=
B
Q
Q
C:/Ruby/scratch.rb:14:匹配中:无法将数组转换为字符串(TypeError)
from C:/Ruby/scratch.rb:14:in`'

编辑:扫描返回一个数组数组,所以通过执行trash=array.last,trash将被降低一级到1个数组。Doing trash=trash[0]然后将其转换为字符串。

问题在于
trash
是一个数组(由单个元素“Q”组成)。当您序列化时,您会看到它

请参阅我的irb中的两行:

test.scan(/([A-Z])=/)
=> [["B"], ["Q"]]
扫描返回数组数组-对于每个匹配,每个组都有一个值


您不能在数组上进行匹配。

问题在于
垃圾桶
是一个数组(由单个元素“Q”组成)。当您序列化时,您会看到它

test = 'class="date">B=oddTu Q='
array = test.scan(/([A-Z])=/)
puts array
trash = array.last
trash.to_s
puts trash
if /Q/.match(trash)
  puts $1
end
请参阅我的irb中的两行:

test.scan(/([A-Z])=/)
=> [["B"], ["Q"]]
扫描返回数组数组-对于每个匹配,每个组都有一个值


你不能在一个数组上进行匹配。

正如Boris指出的,你得到的是一个数组数组。这是因为在正则表达式(括号表达式)中有一个组。如果您有多个这样的组,则每个组都对应于返回数组中的一个元素:

test = 'class="date">B=oddTu Q='
array = test.scan(/([A-Z])=/)
puts array
trash = array.last
trash.to_s
puts trash
if /Q/.match(trash)
  puts $1
end
test.scan(/([A-Z])(=)/)
# => [["B", "="], ["Q", "="]]
对你来说,有几种方法可以解决这个问题。您只需将阵列展平即可:

test.scan(/([A-Z])=/).flatten
# => ["B", "Q"]
或者,您可以使用积极的前瞻,而不是对您感兴趣的位进行分组:

test.scan(/[A-Z](?==)/)
# => ["B", "Q"]

不幸的是,由于您不感兴趣的是
=
符号,它的先行语法
(?=pattern)
看起来有点奇怪,因此
展平
选项可能更清晰。

正如Boris指出的,您得到的是一个数组。这是因为在正则表达式(括号表达式)中有一个组。如果您有多个这样的组,则每个组都对应于返回数组中的一个元素:

test.scan(/([A-Z])(=)/)
# => [["B", "="], ["Q", "="]]
对你来说,有几种方法可以解决这个问题。您只需将阵列展平即可:

test.scan(/([A-Z])=/).flatten
# => ["B", "Q"]
或者,您可以使用积极的前瞻,而不是对您感兴趣的位进行分组:

test.scan(/[A-Z](?==)/)
# => ["B", "Q"]

不幸的是,由于您不感兴趣的位是
=
符号,它的先行语法
(?=pattern)
看起来有点奇怪,因此
展平
选项可能更清晰。

数组
是数组的数组,所以
垃圾
实际上是数组。使用
p trash
转储变量,您将看到
array
是一个数组数组,因此
trash
实际上是一个数组。使用
p trash
转储变量,您将看到