0

我正在尝试对从扫描结果的元素分配的字符串中的字符进行正则表达式。我正在尝试使用 match,它抱怨该变量是一个数组。我对为什么“ 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>'

编辑:扫描返回一个数组数组,所以通过做垃圾 = array.last,垃圾然后被降低一级到 1 个数组。做垃圾=垃圾[0]然后把它变成一个字符串。

4

2 回答 2

2

问题是这trash是一个数组(单个元素“Q”)。当你序列化时你会看到它。

看看我的 irb 中的这两行:

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

扫描返回数组数组 - 每个匹配每个组的值。

您不能对数组进行匹配。

于 2012-12-13T12:54:40.063 回答
1

正如鲍里斯指出的那样,你得到了一个数组数组。这是因为您的正则表达式中有一个组(带括号的表达式)。如果您有几个这样的组,它们将分别对应于返回数组中的一个元素:

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

在你的情况下,有几种方法可以解决这个问题。你可以简单flatten的数组:

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

或者您可以使用积极的前瞻性而不是将您感兴趣的位分组:

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

不幸的是,由于您不感兴趣的位是=符号,因此使用前瞻语法看起来有点奇怪(?=pattern),因此该flatten选项可能更清晰。

于 2012-12-13T14:33:40.487 回答