我正在尝试从扫描结果元素分配的字符串中对正则字符进行正则表达式。我试图使用匹配,它抱怨变量是一个数组。我很困惑为什么“trash
”被视为数组。
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>'
编辑:扫描返回一个数组数组,所以通过执行trash = array.last,trash然后将一个级别转换为1个数组。执行trash = trash [0]然后将其删除为字符串。
答案 0 :(得分:2)
问题是trash
是一个数组(单个元素“Q”)。您在序列化时会看到它。
请参阅我的irb中的两行:
test.scan(/([A-Z])=/)
=> [["B"], ["Q"]]
扫描返回数组 - 对于每个匹配,每个组都有一个值。
您无法在阵列上进行匹配。
答案 1 :(得分:1)
正如鲍里斯指出的那样,你正在获得一系列数组。这是因为你的正则表达式中有一个组(带括号的表达式)。如果你有几个这样的组,它们将分别对应于返回数组中的一个元素:
test.scan(/([A-Z])(=)/)
# => [["B", "="], ["Q", "="]]
在你的情况下,有几种方法可以解决这个问题。你可以简单地flatten
数组:
test.scan(/([A-Z])=/).flatten
# => ["B", "Q"]
或者您可以使用积极的前瞻,而不是将您感兴趣的位分组:
test.scan(/[A-Z](?==)/)
# => ["B", "Q"]
不幸的是,由于您不感兴趣的位是=
符号,因此前瞻语法(?=pattern)
看起来有点奇怪,因此flatten
选项可能更清晰。